annotate lispintro/emacs-lisp-intro.txt @ 47161:6c6dca37308c

(Qbox): Make extern. (syms_of_w32fns): Remove initialization of Qbox.
author Juanma Barranquero <lekktu@gmail.com>
date Fri, 30 Aug 2002 17:44:46 +0000
parents 724e287f33a3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47007
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1 START-INFO-DIR-ENTRY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2 * Emacs Lisp Intro: (eintr).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3 A simple introduction to Emacs Lisp programming.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4 END-INFO-DIR-ENTRY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6 Short Contents
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7 **************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9 An Introduction to Programming in Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10 Preface
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11 List Processing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12 Practicing Evaluation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13 How To Write Function Definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14 A Few Buffer-Related Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15 A Few More Complex Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16 Narrowing and Widening
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
17 `car', `cdr', `cons': Fundamental Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
18 Cutting and Storing Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
19 How Lists are Implemented
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
20 Yanking Text Back
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
21 Loops and Recursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
22 Regular Expression Searches
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
23 Counting: Repetition and Regexps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
24 Counting Words in a `defun'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
25 Readying a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
26 Your `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
27 Debugging
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
28 Conclusion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
29 The `the-the' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
30 Handling the Kill Ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
31 A Graph with Labelled Axes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
32 GNU Free Documentation License
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
33 Index
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
34 About the Author
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
35
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
36
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
37 Table of Contents
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
38 *****************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
39
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
40
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
41 An Introduction to Programming in Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
42
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
43 Preface
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
44 Why Study Emacs Lisp?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
45 On Reading this Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
46 For Whom This is Written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
47 Lisp History
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
48 A Note for Novices
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
49 Thank You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
50
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
51 List Processing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
52 Lisp Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
53 Numbers, Lists inside of Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
54 Lisp Atoms
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
55 Whitespace in Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
56 GNU Emacs Helps You Type Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
57 Run a Program
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
58 Generate an Error Message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
59 Symbol Names and Function Definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
60 The Lisp Interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
61 Complications
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
62 Byte Compiling
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
63 Evaluation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
64 Evaluating Inner Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
65 Variables
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
66 `fill-column', an Example Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
67 Error Message for a Symbol Without a Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
68 Error Message for a Symbol Without a Value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
69 Arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
70 Arguments' Data Types
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
71 An Argument as the Value of a Variable or List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
72 Variable Number of Arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
73 Using the Wrong Type Object as an Argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
74 The `message' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
75 Setting the Value of a Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
76 Using `set'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
77 Using `setq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
78 Counting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
79 Summary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
80 Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
81
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
82 Practicing Evaluation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
83 How to Evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
84 Buffer Names
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
85 Getting Buffers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
86 Switching Buffers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
87 Buffer Size and the Location of Point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
88 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
89
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
90 How To Write Function Definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
91 An Aside about Primitive Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
92 The `defun' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
93 Install a Function Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
94 The effect of installation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
95 Change a Function Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
96 Make a Function Interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
97 An Interactive `multiply-by-seven', An Overview
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
98 An Interactive `multiply-by-seven'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
99 Different Options for `interactive'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
100 Install Code Permanently
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
101 `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
102 `let' Prevents Confusion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
103 The Parts of a `let' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
104 Sample `let' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
105 Uninitialized Variables in a `let' Statement
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
106 The `if' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
107 `if' in more detail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
108 The `type-of-animal' Function in Detail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
109 If-then-else Expressions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
110 Truth and Falsehood in Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
111 An explanation of `nil'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
112 `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
113 Point and Mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
114 Template for a `save-excursion' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
115 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
116 Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
117
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
118 A Few Buffer-Related Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
119 Finding More Information
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
120 A Simplified `beginning-of-buffer' Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
121 The Definition of `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
122 An overview of `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
123 Body of `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
124 The Definition of `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
125 An Overview of `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
126 The `append-to-buffer' Interactive Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
127 The Body of `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
128 `save-excursion' in `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
129 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
130 Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
131
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
132 A Few More Complex Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
133 The Definition of `copy-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
134 The Definition of `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
135 The Code for `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
136 The Interactive Expression in `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
137 A Read-only Buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
138 `b' in an Interactive Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
139 The Body of the `insert-buffer' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
140 `insert-buffer' With an `if' Instead of an `or'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
141 The `or' in the Body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
142 The `let' Expression in `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
143 Complete Definition of `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
144 Optional Arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
145 `beginning-of-buffer' with an Argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
146 Disentangle `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
147 What happens in a large buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
148 What happens in a small buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
149 The Complete `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
150 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
151 `optional' Argument Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
152
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
153 Narrowing and Widening
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
154 The Advantages of Narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
155 The `save-restriction' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
156 `what-line'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
157 Exercise with Narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
159 `car', `cdr', `cons': Fundamental Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
160 Strange Names
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
161 `car' and `cdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
162 `cons'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
163 Build a list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
164 Find the Length of a List: `length'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
165 `nthcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
166 `nth'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
167 `setcar'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
168 `setcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
169 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
170
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
171 Cutting and Storing Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
172 Storing Text in a List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
173 `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
174 The Complete `zap-to-char' Implementation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
175 The `interactive' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
176 The Body of `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
177 The `search-forward' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
178 The `progn' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
179 Summing up `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
180 `kill-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
181 The Complete `kill-region' Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
182 `condition-case'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
183 `delete-and-extract-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
184 Digression into C
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
185 Initializing a Variable with `defvar'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
186 Seeing the Current Value of a Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
187 `defvar' and an asterisk
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
188 `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
189 The complete `copy-region-as-kill' function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
190 The Body of `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
191 `last-command' and `this-command'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
192 The `kill-append' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
193 The `kill-new' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
194 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
195 Searching Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
197 How Lists are Implemented
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
198 Lists diagrammed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
199 Symbols as a Chest of Drawers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
200 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
201
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
202 Yanking Text Back
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
203 Kill Ring Overview
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
204 The `kill-ring-yank-pointer' Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
205 Exercises with `yank' and `nthcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
206
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
207 Loops and Recursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
208 `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
209 Looping with `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
210 A `while' Loop and a List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
211 An Example: `print-elements-of-list'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
212 A Loop with an Incrementing Counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
213 Example with incrementing counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
214 The parts of the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
215 Putting the function definition together
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
216 Loop with a Decrementing Counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
217 Example with decrementing counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
218 The parts of the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
219 Putting the function definition together
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
220 Save your time: `dolist' and `dotimes'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
221 The `dolist' Macro
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
222 The `dotimes' Macro
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
223 Recursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
224 Building Robots: Extending the Metaphor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
225 The Parts of a Recursive Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
226 Recursion with a List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
227 Recursion in Place of a Counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
228 An argument of 1 or 2
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
229 An argument of 3 or 4
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
230 Recursion Example Using `cond'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
231 Recursive Patterns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
232 Recursive Pattern: _every_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
233 Recursive Pattern: _accumulate_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
234 Recursive Pattern: _keep_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
235 Recursion without Deferments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
236 No Deferment Solution
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
237 Looping Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
238
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
239 Regular Expression Searches
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
240 The Regular Expression for `sentence-end'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
241 The `re-search-forward' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
242 `forward-sentence'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
243 Complete `forward-sentence' function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
244 The `while' loops
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
245 The regular expression search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
246 `forward-paragraph': a Goldmine of Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
247 Shortened `forward-paragraph' function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
248 The `let*' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
249 The forward motion `while' loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
250 Between paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
251 Within paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
252 No fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
253 With a fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
254 Summary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
255 Create Your Own `TAGS' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
256 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
257 Exercises with `re-search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
258
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
259 Counting: Repetition and Regexps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
260 Counting words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
261 The `count-words-region' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
262 Designing `count-words-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
263 The Whitespace Bug in `count-words-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
264 Count Words Recursively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
265 Exercise: Counting Punctuation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
266
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
267 Counting Words in a `defun'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
268 Divide and Conquer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
269 What to Count?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
270 What Constitutes a Word or Symbol?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
271 The `count-words-in-defun' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
272 Count Several `defuns' Within a File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
273 Find a File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
274 `lengths-list-file' in Detail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
275 Count Words in `defuns' in Different Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
276 Determine the lengths of `defuns'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
277 The `append' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
278 Recursively Count Words in Different Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
279 Prepare the Data for Display in a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
280 Sorting Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
281 Making a List of Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
282 Counting function definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
283
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
284 Readying a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
285 Printing the Columns of a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
286 The `graph-body-print' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
287 The `recursive-graph-body-print' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
288 Need for Printed Axes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
289 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
290
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
291 Your `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
292 Emacs' Default Configuration
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
293 Site-wide Initialization Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
294 Specifying Variables using `defcustom'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
295 Beginning a `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
296 Text and Auto Fill Mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
297 Mail Aliases
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
298 Indent Tabs Mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
299 Some Keybindings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
300 Keymaps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
301 Loading Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
302 Autoloading
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
303 A Simple Extension: `line-to-top-of-window'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
304 X11 Colors
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
305 Miscellaneous Settings for a `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
306 A Modified Mode Line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
307
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
308 Debugging
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
309 `debug'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
310 `debug-on-entry'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
311 `debug-on-quit' and `(debug)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
312 The `edebug' Source Level Debugger
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
313 Debugging Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
314
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
315 Conclusion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
316
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
317 The `the-the' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
318
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
319 Handling the Kill Ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
320 The `rotate-yank-pointer' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
321 `rotate-yank-pointer' in Outline
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
322 The Body of `rotate-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
323 Digression about the word `error'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
324 The else-part of the `if' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
325 The `%' remainder function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
326 Using `%' in `rotate-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
327 Pointing to the last element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
328 `yank'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
329 Passing the argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
330 Passing a negative argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
331 `yank-pop'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
332
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
333 A Graph with Labelled Axes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
334 Labelled Example Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
335 The `print-graph' Varlist
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
336 The `print-Y-axis' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
337 What height should the label be?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
338 Side Trip: Compute a Remainder
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
339 Construct a Y Axis Element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
340 Create a Y Axis Column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
341 The Not Quite Final Version of `print-Y-axis'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
342 The `print-X-axis' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
343 Similarities and differences
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
344 X Axis Tic Marks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
345 Printing the Whole Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
346 Changes for the Final Version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
347 Testing `print-graph'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
348 Graphing Numbers of Words and Symbols
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
349 A `lambda' Expression: Useful Anonymity
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
350 The `mapcar' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
351 Another Bug ... Most Insidious
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
352 The Printed Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
353
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
354 GNU Free Documentation License
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
355
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
356 Index
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
357
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
358 About the Author
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
359
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
360
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
361 An Introduction to Programming in Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
362 ********************************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
363
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
364 This is an introduction to `Programming in Emacs Lisp', for people
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
365 who are not programmers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
366
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
367 Edition 2.07, 2002 Aug 23
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
368
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
369 Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1997, 2001, 2002
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
370 Free Software Foundation, Inc.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
371
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
372
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
373 Published by the Free Software Foundation, Inc.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
374 59 Temple Place, Suite 330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
375 Boston, MA 02111-1307 USA
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
376 Edition 2.07, 2002 Aug 23
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
377
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
378 ISBN 1-882114-43-4
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
379
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
380 Permission is granted to copy, distribute and/or modify this document
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
381 under the terms of the GNU Free Documentation License, Version 1.1 or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
382 any later version published by the Free Software Foundation; there
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
383 being no Invariant Section, with the Front-Cover Texts being "A GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
384 Manual", and with the Back-Cover Texts as in (a) below. A copy of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
385 the license is included in the section entitled "GNU Free
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
386 Documentation License".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
387
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
388 (a) The FSF's Back-Cover Text is: "You have freedom to copy and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
389 modify this GNU Manual, like GNU software. Copies published by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
390 Free Software Foundation raise funds for GNU development."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
391 This master menu first lists each chapter and index; then it lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
392 every node in every chapter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
393
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
394 Preface
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
395 *******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
396
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
397 Most of the GNU Emacs integrated environment is written in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
398 programming language called Emacs Lisp. The code written in this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
399 programming language is the software--the sets of instructions--that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
400 tell the computer what to do when you give it commands. Emacs is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
401 designed so that you can write new code in Emacs Lisp and easily
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
402 install it as an extension to the editor.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
403
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
404 (GNU Emacs is sometimes called an "extensible editor", but it does
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
405 much more than provide editing capabilities. It is better to refer to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
406 Emacs as an "extensible computing environment". However, that phrase
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
407 is quite a mouthful. It is easier to refer to Emacs simply as an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
408 editor. Moreover, everything you do in Emacs--find the Mayan date
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
409 and phases of the moon, simplify polynomials, debug code, manage
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
410 files, read letters, write books--all these activities are kinds of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
411 editing in the most general sense of the word.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
412
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
413 Why Study Emacs Lisp?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
414 =====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
415
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
416 Although Emacs Lisp is usually thought of in association only with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
417 Emacs, it is a full computer programming language. You can use Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
418 Lisp as you would any other programming language.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
419
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
420 Perhaps you want to understand programming; perhaps you want to extend
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
421 Emacs; or perhaps you want to become a programmer. This introduction
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
422 to Emacs Lisp is designed to get you started: to guide you in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
423 learning the fundamentals of programming, and more importantly, to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
424 show you how you can teach yourself to go further.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
425
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
426 On Reading this Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
427 ====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
428
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
429 All through this document, you will see little sample programs you can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
430 run inside of Emacs. If you read this document in Info inside of GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
431 Emacs, you can run the programs as they appear. (This is easy to do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
432 and is explained when the examples are presented.) Alternatively,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
433 you can read this introduction as a printed book while sitting beside
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
434 a computer running Emacs. (This is what I like to do; I like printed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
435 books.) If you don't have a running Emacs beside you, you can still
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
436 read this book, but in this case, it is best to treat it as a novel
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
437 or as a travel guide to a country not yet visited: interesting, but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
438 not the same as being there.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
440 Much of this introduction is dedicated to walk-throughs or guided
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
441 tours of code used in GNU Emacs. These tours are designed for two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
442 purposes: first, to give you familiarity with real, working code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
443 (code you use every day); and, second, to give you familiarity with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
444 the way Emacs works. It is interesting to see how a working
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
445 environment is implemented. Also, I hope that you will pick up the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
446 habit of browsing through source code. You can learn from it and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
447 mine it for ideas. Having GNU Emacs is like having a dragon's cave
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
448 of treasures.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
449
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
450 In addition to learning about Emacs as an editor and Emacs Lisp as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
451 programming language, the examples and guided tours will give you an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
452 opportunity to get acquainted with Emacs as a Lisp programming
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
453 environment. GNU Emacs supports programming and provides tools that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
454 you will want to become comfortable using, such as `M-.' (the key
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
455 which invokes the `find-tag' command). You will also learn about
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
456 buffers and other objects that are part of the environment. Learning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
457 about these features of Emacs is like learning new routes around your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
458 home town.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
459
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
460 Finally, I hope to convey some of the skills for using Emacs to learn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
461 aspects of programming that you don't know. You can often use Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
462 to help you understand what puzzles you or to find out how to do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
463 something new. This self-reliance is not only a pleasure, but an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
464 advantage.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
465
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
466 For Whom This is Written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
467 ========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
468
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
469 This text is written as an elementary introduction for people who are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
470 not programmers. If you are a programmer, you may not be satisfied
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
471 with this primer. The reason is that you may have become expert at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
472 reading reference manuals and be put off by the way this text is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
473 organized.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
474
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
475 An expert programmer who reviewed this text said to me:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
476
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
477 I prefer to learn from reference manuals. I "dive into" each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
478 paragraph, and "come up for air" between paragraphs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
479
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
480 When I get to the end of a paragraph, I assume that that subject
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
481 is done, finished, that I know everything I need (with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
482 possible exception of the case when the next paragraph starts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
483 talking about it in more detail). I expect that a well written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
484 reference manual will not have a lot of redundancy, and that it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
485 will have excellent pointers to the (one) place where the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
486 information I want is.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
487
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
488 This introduction is not written for this person!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
489
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
490 Firstly, I try to say everything at least three times: first, to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
491 introduce it; second, to show it in context; and third, to show it in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
492 a different context, or to review it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
494 Secondly, I hardly ever put all the information about a subject in one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
495 place, much less in one paragraph. To my way of thinking, that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
496 imposes too heavy a burden on the reader. Instead I try to explain
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
497 only what you need to know at the time. (Sometimes I include a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
498 little extra information so you won't be surprised later when the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
499 additional information is formally introduced.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
500
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
501 When you read this text, you are not expected to learn everything the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
502 first time. Frequently, you need only make, as it were, a `nodding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
503 acquaintance' with some of the items mentioned. My hope is that I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
504 have structured the text and given you enough hints that you will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
505 alert to what is important, and concentrate on it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
506
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
507 You will need to "dive into" some paragraphs; there is no other way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
508 to read them. But I have tried to keep down the number of such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
509 paragraphs. This book is intended as an approachable hill, rather
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
510 than as a daunting mountain.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
511
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
512 This introduction to `Programming in Emacs Lisp' has a companion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
513 document, *Note The GNU Emacs Lisp Reference Manual: (elisp)Top. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
514 reference manual has more detail than this introduction. In the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
515 reference manual, all the information about one topic is concentrated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
516 in one place. You should turn to it if you are like the programmer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
517 quoted above. And, of course, after you have read this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
518 `Introduction', you will find the `Reference Manual' useful when you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
519 are writing your own programs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
520
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
521 Lisp History
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
522 ============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
523
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
524 Lisp was first developed in the late 1950s at the Massachusetts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
525 Institute of Technology for research in artificial intelligence. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
526 great power of the Lisp language makes it superior for other purposes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
527 as well, such as writing editor commands and integrated environments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
528
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
529 GNU Emacs Lisp is largely inspired by Maclisp, which was written at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
530 MIT in the 1960s. It is somewhat inspired by Common Lisp, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
531 became a standard in the 1980s. However, Emacs Lisp is much simpler
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
532 than Common Lisp. (The standard Emacs distribution contains an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
533 optional extensions file, `cl.el', that adds many Common Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
534 features to Emacs Lisp.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
535
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
536 A Note for Novices
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
537 ==================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
538
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
539 If you don't know GNU Emacs, you can still read this document
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
540 profitably. However, I recommend you learn Emacs, if only to learn to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
541 move around your computer screen. You can teach yourself how to use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
542 Emacs with the on-line tutorial. To use it, type `C-h t'. (This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
543 means you press and release the <CTRL> key and the `h' at the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
544 time, and then press and release `t'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
545
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
546 Also, I often refer to one of Emacs' standard commands by listing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
547 keys which you press to invoke the command and then giving the name of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
548 the command in parentheses, like this: `M-C-\' (`indent-region').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
549 What this means is that the `indent-region' command is customarily
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
550 invoked by typing `M-C-\'. (You can, if you wish, change the keys
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
551 that are typed to invoke the command; this is called "rebinding".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
552 *Note Keymaps: Keymaps.) The abbreviation `M-C-\' means that you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
553 type your <META> key, <CTRL> key and <\> key all at the same time.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
554 (On many modern keyboards the <META> key is labelled <ALT>.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
555 Sometimes a combination like this is called a keychord, since it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
556 similar to the way you play a chord on a piano. If your keyboard does
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
557 not have a <META> key, the <ESC> key prefix is used in place of it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
558 In this case, `M-C-\' means that you press and release your <ESC> key
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
559 and then type the <CTRL> key and the <\> key at the same time. But
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
560 usually `M-C-\' means press the <CTRL> key along with the key that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
561 labelled <ALT> and, at the same time, press the <\> key.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
562
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
563 In addition to typing a lone keychord, you can prefix what you type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
564 with `C-u', which is called the `universal argument'. The `C-u'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
565 keychord passes an argument to the subsequent command. Thus, to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
566 indent a region of plain text by 6 spaces, mark the region, and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
567 type `C-u 6 M-C-\'. (If you do not specify a number, Emacs either
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
568 passes the number 4 to the command or otherwise runs the command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
569 differently than it would otherwise.) *Note Numeric Arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
570 (emacs)Arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
571
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
572 If you are reading this in Info using GNU Emacs, you can read through
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
573 this whole document just by pressing the space bar, <SPC>. (To learn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
574 about Info, type `C-h i' and then select Info.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
575
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
576 A note on terminology: when I use the word Lisp alone, I often am
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
577 referring to the various dialects of Lisp in general, but when I speak
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
578 of Emacs Lisp, I am referring to GNU Emacs Lisp in particular.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
579
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
580 Thank You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
581 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
582
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
583 My thanks to all who helped me with this book. My especial thanks to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
584 Jim Blandy, Noah Friedman, Jim Kingdon, Roland McGrath, Frank Ritter,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
585 Randy Smith, Richard M. Stallman, and Melissa Weisshaus. My thanks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
586 also go to both Philip Johnson and David Stampe for their patient
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
587 encouragement. My mistakes are my own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
588
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
589 Robert J. Chassell
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
590
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
591 List Processing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
592 ***************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
593
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
594 To the untutored eye, Lisp is a strange programming language. In Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
595 code there are parentheses everywhere. Some people even claim that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
596 the name stands for `Lots of Isolated Silly Parentheses'. But the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
597 claim is unwarranted. Lisp stands for LISt Processing, and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
598 programming language handles _lists_ (and lists of lists) by putting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
599 them between parentheses. The parentheses mark the boundaries of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
600 list. Sometimes a list is preceded by a single apostrophe or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
601 quotation mark, `''. Lists are the basis of Lisp.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
602
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
603 Lisp Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
604 ==========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
605
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
606 In Lisp, a list looks like this: `'(rose violet daisy buttercup)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
607 This list is preceded by a single apostrophe. It could just as well
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
608 be written as follows, which looks more like the kind of list you are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
609 likely to be familiar with:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
610
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
611 '(rose
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
612 violet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
613 daisy
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
614 buttercup)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
615
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
616 The elements of this list are the names of the four different flowers,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
617 separated from each other by whitespace and surrounded by parentheses,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
618 like flowers in a field with a stone wall around them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
619
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
620 Numbers, Lists inside of Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
621 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
622
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
623 Lists can also have numbers in them, as in this list: `(+ 2 2)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
624 This list has a plus-sign, `+', followed by two `2's, each separated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
625 by whitespace.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
626
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
627 In Lisp, both data and programs are represented the same way; that is,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
628 they are both lists of words, numbers, or other lists, separated by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
629 whitespace and surrounded by parentheses. (Since a program looks like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
630 data, one program may easily serve as data for another; this is a very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
631 powerful feature of Lisp.) (Incidentally, these two parenthetical
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
632 remarks are _not_ Lisp lists, because they contain `;' and `.' as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
633 punctuation marks.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
634
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
635 Here is another list, this time with a list inside of it:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
636
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
637 '(this list has (a list inside of it))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
638
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
639 The components of this list are the words `this', `list', `has', and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
640 the list `(a list inside of it)'. The interior list is made up of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
641 the words `a', `list', `inside', `of', `it'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
642
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
643 Lisp Atoms
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
644 ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
645
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
646 In Lisp, what we have been calling words are called "atoms". This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
647 term comes from the historical meaning of the word atom, which means
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
648 `indivisible'. As far as Lisp is concerned, the words we have been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
649 using in the lists cannot be divided into any smaller parts and still
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
650 mean the same thing as part of a program; likewise with numbers and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
651 single character symbols like `+'. On the other hand, unlike an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
652 atom, a list can be split into parts. (*Note `car' `cdr' & `cons'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
653 Fundamental Functions: car cdr & cons.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
654
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
655 In a list, atoms are separated from each other by whitespace. They
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
656 can be right next to a parenthesis.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
657
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
658 Technically speaking, a list in Lisp consists of parentheses
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
659 surrounding atoms separated by whitespace or surrounding other lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
660 or surrounding both atoms and other lists. A list can have just one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
661 atom in it or have nothing in it at all. A list with nothing in it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
662 looks like this: `()', and is called the "empty list". Unlike
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
663 anything else, an empty list is considered both an atom and a list at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
664 the same time.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
665
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
666 The printed representation of both atoms and lists are called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
667 "symbolic expressions" or, more concisely, "s-expressions". The word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
668 "expression" by itself can refer to either the printed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
669 representation, or to the atom or list as it is held internally in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
670 computer. Often, people use the term "expression" indiscriminately.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
671 (Also, in many texts, the word "form" is used as a synonym for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
672 expression.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
673
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
674 Incidentally, the atoms that make up our universe were named such when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
675 they were thought to be indivisible; but it has been found that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
676 physical atoms are not indivisible. Parts can split off an atom or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
677 it can fission into two parts of roughly equal size. Physical atoms
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
678 were named prematurely, before their truer nature was found. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
679 Lisp, certain kinds of atom, such as an array, can be separated into
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
680 parts; but the mechanism for doing this is different from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
681 mechanism for splitting a list. As far as list operations are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
682 concerned, the atoms of a list are unsplittable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
683
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
684 As in English, the meanings of the component letters of a Lisp atom
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
685 are different from the meaning the letters make as a word. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
686 example, the word for the South American sloth, the `ai', is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
687 completely different from the two words, `a', and `i'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
688
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
689 There are many kinds of atom in nature but only a few in Lisp: for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
690 example, "numbers", such as 37, 511, or 1729, and "symbols", such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
691 `+', `foo', or `forward-line'. The words we have listed in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
692 examples above are all symbols. In everyday Lisp conversation, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
693 word "atom" is not often used, because programmers usually try to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
694 more specific about what kind of atom they are dealing with. Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
695 programming is mostly about symbols (and sometimes numbers) within
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
696 lists. (Incidentally, the preceding three word parenthetical remark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
697 is a proper list in Lisp, since it consists of atoms, which in this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
698 case are symbols, separated by whitespace and enclosed by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
699 parentheses, without any non-Lisp punctuation.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
700
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
701 In addition, text between double quotation marks--even sentences or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
702 paragraphs--is an atom. Here is an example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
703
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
704 '(this list includes "text between quotation marks.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
705
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
706 In Lisp, all of the quoted text including the punctuation mark and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
707 blank spaces is a single atom. This kind of atom is called a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
708 "string" (for `string of characters') and is the sort of thing that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
709 is used for messages that a computer can print for a human to read.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
710 Strings are a different kind of atom than numbers or symbols and are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
711 used differently.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
712
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
713 Whitespace in Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
714 -------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
715
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
716 The amount of whitespace in a list does not matter. From the point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
717 of view of the Lisp language,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
718
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
719 '(this list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
720 looks like this)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
721
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
722 is exactly the same as this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
723
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
724 '(this list looks like this)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
725
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
726 Both examples show what to Lisp is the same list, the list made up of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
727 the symbols `this', `list', `looks', `like', and `this' in that order.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
728
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
729 Extra whitespace and newlines are designed to make a list more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
730 readable by humans. When Lisp reads the expression, it gets rid of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
731 all the extra whitespace (but it needs to have at least one space
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
732 between atoms in order to tell them apart.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
733
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
734 Odd as it seems, the examples we have seen cover almost all of what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
735 Lisp lists look like! Every other list in Lisp looks more or less
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
736 like one of these examples, except that the list may be longer and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
737 more complex. In brief, a list is between parentheses, a string is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
738 between quotation marks, a symbol looks like a word, and a number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
739 looks like a number. (For certain situations, square brackets, dots
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
740 and a few other special characters may be used; however, we will go
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
741 quite far without them.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
742
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
743 GNU Emacs Helps You Type Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
744 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
745
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
746 When you type a Lisp expression in GNU Emacs using either Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
747 Interaction mode or Emacs Lisp mode, you have available to you several
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
748 commands to format the Lisp expression so it is easy to read. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
749 example, pressing the <TAB> key automatically indents the line the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
750 cursor is on by the right amount. A command to properly indent the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
751 code in a region is customarily bound to `M-C-\'. Indentation is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
752 designed so that you can see which elements of a list belong to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
753 list--elements of a sub-list are indented more than the elements of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
754 the enclosing list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
755
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
756 In addition, when you type a closing parenthesis, Emacs momentarily
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
757 jumps the cursor back to the matching opening parenthesis, so you can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
758 see which one it is. This is very useful, since every list you type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
759 in Lisp must have its closing parenthesis match its opening
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
760 parenthesis. (*Note Major Modes: (emacs)Major Modes, for more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
761 information about Emacs' modes.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
762
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
763 Run a Program
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
764 =============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
765
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
766 A list in Lisp--any list--is a program ready to run. If you run it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
767 (for which the Lisp jargon is "evaluate"), the computer will do one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
768 of three things: do nothing except return to you the list itself; send
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
769 you an error message; or, treat the first symbol in the list as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
770 command to do something. (Usually, of course, it is the last of these
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
771 three things that you really want!)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
772
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
773 The single apostrophe, `'', that I put in front of some of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
774 example lists in preceding sections is called a "quote"; when it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
775 precedes a list, it tells Lisp to do nothing with the list, other than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
776 take it as it is written. But if there is no quote preceding a list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
777 the first item of the list is special: it is a command for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
778 computer to obey. (In Lisp, these commands are called _functions_.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
779 The list `(+ 2 2)' shown above did not have a quote in front of it,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
780 so Lisp understands that the `+' is an instruction to do something
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
781 with the rest of the list: add the numbers that follow.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
782
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
783 If you are reading this inside of GNU Emacs in Info, here is how you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
784 can evaluate such a list: place your cursor immediately after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
785 right hand parenthesis of the following list and then type `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
786
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
787 (+ 2 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
788
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
789 You will see the number `4' appear in the echo area. (In the jargon,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
790 what you have just done is "evaluate the list." The echo area is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
791 line at the bottom of the screen that displays or "echoes" text.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
792 Now try the same thing with a quoted list: place the cursor right
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
793 after the following list and type `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
794
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
795 '(this is a quoted list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
797 You will see `(this is a quoted list)' appear in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
798
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
799 In both cases, what you are doing is giving a command to the program
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
800 inside of GNU Emacs called the "Lisp interpreter"--giving the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
801 interpreter a command to evaluate the expression. The name of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
802 Lisp interpreter comes from the word for the task done by a human who
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
803 comes up with the meaning of an expression--who "interprets" it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
804
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
805 You can also evaluate an atom that is not part of a list--one that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
806 not surrounded by parentheses; again, the Lisp interpreter translates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
807 from the humanly readable expression to the language of the computer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
808 But before discussing this (*note Variables::), we will discuss what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
809 the Lisp interpreter does when you make an error.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
810
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
811 Generate an Error Message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
812 =========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
813
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
814 Partly so you won't worry if you do it accidentally, we will now give
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
815 a command to the Lisp interpreter that generates an error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
816 This is a harmless activity; and indeed, we will often try to generate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
817 error messages intentionally. Once you understand the jargon, error
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
818 messages can be informative. Instead of being called "error"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
819 messages, they should be called "help" messages. They are like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
820 signposts to a traveller in a strange country; deciphering them can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
821 hard, but once understood, they can point the way.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
822
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
823 The error message is generated by a built-in GNU Emacs debugger. We
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
824 will `enter the debugger'. You get out of the debugger by typing `q'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
825
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
826 What we will do is evaluate a list that is not quoted and does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
827 have a meaningful command as its first element. Here is a list almost
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
828 exactly the same as the one we just used, but without the single-quote
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
829 in front of it. Position the cursor right after it and type `C-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
830 C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
831
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
832 (this is an unquoted list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
833
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
834 What you see depends on which version of Emacs you are running. GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
835 Emacs version 21 provides more information than version 20 and before.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
836 First, the more recent result of generating an error; then the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
837 earlier, version 20 result.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
838
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
839 In GNU Emacs version 21, a `*Backtrace*' window will open up and you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
840 will see the following in it:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
841
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
842 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
843 Debugger entered--Lisp error: (void-function this)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
844 (this is an unquoted list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
845 eval((this is an unquoted list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
846 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
847 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
848 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
849 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
850
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
851 Your cursor will be in this window (you may have to wait a few seconds
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
852 before it becomes visible). To quit the debugger and make the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
853 debugger window go away, type:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
854
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
855 q
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
856
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
857 Please type `q' right now, so you become confident that you can get
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
858 out of the debugger. Then, type `C-x C-e' again to re-enter it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
859
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
860 Based on what we already know, we can almost read this error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
861
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
862 You read the `*Backtrace*' buffer from the bottom up; it tells you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
863 what Emacs did. When you typed `C-x C-e', you made an interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
864 call to the command `eval-last-sexp'. `eval' is an abbreviation for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
865 `evaluate' and `sexp' is an abbreviation for `symbolic expression'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
866 The command means `evaluate last symbolic expression', which is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
867 expression just before your cursor.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
868
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
869 Each line above tells you what the Lisp interpreter evaluated next.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
870 The most recent action is at the top. The buffer is called the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
871 `*Backtrace*' buffer because it enables you to track Emacs backwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
872
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
873 At the top of the `*Backtrace*' buffer, you see the line:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
874
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
875 Debugger entered--Lisp error: (void-function this)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
876
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
877 The Lisp interpreter tried to evaluate the first atom of the list, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
878 word `this'. It is this action that generated the error message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
879 `void-function this'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
880
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
881 The message contains the words `void-function' and `this'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
883 The word `function' was mentioned once before. It is a very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
884 important word. For our purposes, we can define it by saying that a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
885 "function" is a set of instructions to the computer that tell the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
886 computer to do something.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
888 Now we can begin to understand the error message: `void-function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
889 this'. The function (that is, the word `this') does not have a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
890 definition of any set of instructions for the computer to carry out.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
891
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
892 The slightly odd word, `void-function', is designed to cover the way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
893 Emacs Lisp is implemented, which is that when a symbol does not have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
894 a function definition attached to it, the place that should contain
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
895 the instructions is `void'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
896
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
897 On the other hand, since we were able to add 2 plus 2 successfully, by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
898 evaluating `(+ 2 2)', we can infer that the symbol `+' must have a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
899 set of instructions for the computer to obey and those instructions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
900 must be to add the numbers that follow the `+'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
901
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
902 In GNU Emacs version 20, and in earlier versions, you will see only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
903 one line of error message; it will appear in the echo area and look
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
904 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
905
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
906 Symbol's function definition is void: this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
907
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
908 (Also, your terminal may beep at you--some do, some don't; and others
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
909 blink. This is just a device to get your attention.) The message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
910 goes away as soon as you type another key, even just to move the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
911 cursor.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
912
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
913 We know the meaning of the word `Symbol'. It refers to the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
914 atom of the list, the word `this'. The word `function' refers to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
915 instructions that tell the computer what to do. (Technically, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
916 symbol tells the computer where to find the instructions, but this is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
917 a complication we can ignore for the moment.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
918
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
919 The error message can be understood: `Symbol's function definition is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
920 void: this'. The symbol (that is, the word `this') lacks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
921 instructions for the computer to carry out.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
922
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
923 Symbol Names and Function Definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
924 =====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
925
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
926 We can articulate another characteristic of Lisp based on what we have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
927 discussed so far--an important characteristic: a symbol, like `+', is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
928 not itself the set of instructions for the computer to carry out.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
929 Instead, the symbol is used, perhaps temporarily, as a way of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
930 locating the definition or set of instructions. What we see is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
931 name through which the instructions can be found. Names of people
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
932 work the same way. I can be referred to as `Bob'; however, I am not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
933 the letters `B', `o', `b' but am the consciousness consistently
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
934 associated with a particular life-form. The name is not me, but it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
935 can be used to refer to me.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
936
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
937 In Lisp, one set of instructions can be attached to several names.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
938 For example, the computer instructions for adding numbers can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
939 linked to the symbol `plus' as well as to the symbol `+' (and are in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
940 some dialects of Lisp). Among humans, I can be referred to as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
941 `Robert' as well as `Bob' and by other words as well.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
942
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
943 On the other hand, a symbol can have only one function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
944 attached to it at a time. Otherwise, the computer would be confused
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
945 as to which definition to use. If this were the case among people,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
946 only one person in the world could be named `Bob'. However, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
947 function definition to which the name refers can be changed readily.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
948 (*Note Install a Function Definition: Install.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
949
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
950 Since Emacs Lisp is large, it is customary to name symbols in a way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
951 that identifies the part of Emacs to which the function belongs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
952 Thus, all the names for functions that deal with Texinfo start with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
953 `texinfo-' and those for functions that deal with reading mail start
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
954 with `rmail-'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
955
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
956 The Lisp Interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
957 ====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
958
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
959 Based on what we have seen, we can now start to figure out what the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
960 Lisp interpreter does when we command it to evaluate a list. First,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
961 it looks to see whether there is a quote before the list; if there
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
962 is, the interpreter just gives us the list. On the other hand, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
963 there is no quote, the interpreter looks at the first element in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
964 list and sees whether it has a function definition. If it does, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
965 interpreter carries out the instructions in the function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
966 Otherwise, the interpreter prints an error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
967
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
968 This is how Lisp works. Simple. There are added complications which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
969 we will get to in a minute, but these are the fundamentals. Of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
970 course, to write Lisp programs, you need to know how to write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
971 function definitions and attach them to names, and how to do this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
972 without confusing either yourself or the computer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
973
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
974 Complications
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
975 -------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
976
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
977 Now, for the first complication. In addition to lists, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
978 interpreter can evaluate a symbol that is not quoted and does not have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
979 parentheses around it. The Lisp interpreter will attempt to determine
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
980 the symbol's value as a "variable". This situation is described in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
981 the section on variables. (*Note Variables::.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
982
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
983 The second complication occurs because some functions are unusual and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
984 do not work in the usual manner. Those that don't are called "special
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
985 forms". They are used for special jobs, like defining a function, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
986 there are not many of them. In the next few chapters, you will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
987 introduced to several of the more important special forms.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
988
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
989 The third and final complication is this: if the function that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
990 Lisp interpreter is looking at is not a special form, and if it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
991 part of a list, the Lisp interpreter looks to see whether the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
992 has a list inside of it. If there is an inner list, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
993 interpreter first figures out what it should do with the inside list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
994 and then it works on the outside list. If there is yet another list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
995 embedded inside the inner list, it works on that one first, and so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
996 on. It always works on the innermost list first. The interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
997 works on the innermost list first, to evaluate the result of that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
998 list. The result may be used by the enclosing expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
999
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1000 Otherwise, the interpreter works left to right, from one expression to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1001 the next.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1002
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1003 Byte Compiling
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1004 --------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1006 One other aspect of interpreting: the Lisp interpreter is able to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1007 interpret two kinds of entity: humanly readable code, on which we will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1008 focus exclusively, and specially processed code, called "byte
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1009 compiled" code, which is not humanly readable. Byte compiled code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1010 runs faster than humanly readable code.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1011
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1012 You can transform humanly readable code into byte compiled code by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1013 running one of the compile commands such as `byte-compile-file'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1014 Byte compiled code is usually stored in a file that ends with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1015 `.elc' extension rather than a `.el' extension. You will see both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1016 kinds of file in the `emacs/lisp' directory; the files to read are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1017 those with `.el' extensions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1018
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1019 As a practical matter, for most things you might do to customize or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1020 extend Emacs, you do not need to byte compile; and I will not discuss
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1021 the topic here. *Note Byte Compilation: (elisp)Byte Compilation, for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1022 a full description of byte compilation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1023
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1024 Evaluation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1025 ==========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1026
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1027 When the Lisp interpreter works on an expression, the term for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1028 activity is called "evaluation". We say that the interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1029 `evaluates the expression'. I've used this term several times before.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1030 The word comes from its use in everyday language, `to ascertain the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1031 value or amount of; to appraise', according to `Webster's New
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1032 Collegiate Dictionary'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1033
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1034 After evaluating an expression, the Lisp interpreter will most likely
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1035 "return" the value that the computer produces by carrying out the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1036 instructions it found in the function definition, or perhaps it will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1037 give up on that function and produce an error message. (The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1038 interpreter may also find itself tossed, so to speak, to a different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1039 function or it may attempt to repeat continually what it is doing for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1040 ever and ever in what is called an `infinite loop'. These actions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1041 are less common; and we can ignore them.) Most frequently, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1042 interpreter returns a value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1044 At the same time the interpreter returns a value, it may do something
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1045 else as well, such as move a cursor or copy a file; this other kind of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1046 action is called a "side effect". Actions that we humans think are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1047 important, such as printing results, are often "side effects" to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1048 Lisp interpreter. The jargon can sound peculiar, but it turns out
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1049 that it is fairly easy to learn to use side effects.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1050
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1051 In summary, evaluating a symbolic expression most commonly causes the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1052 Lisp interpreter to return a value and perhaps carry out a side
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1053 effect; or else produce an error.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1054
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1055 Evaluating Inner Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1056 ----------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1057
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1058 If evaluation applies to a list that is inside another list, the outer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1059 list may use the value returned by the first evaluation as information
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1060 when the outer list is evaluated. This explains why inner expressions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1061 are evaluated first: the values they return are used by the outer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1062 expressions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1063
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1064 We can investigate this process by evaluating another addition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1065 example. Place your cursor after the following expression and type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1066 `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1067
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1068 (+ 2 (+ 3 3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1069
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1070 The number 8 will appear in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1072 What happens is that the Lisp interpreter first evaluates the inner
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1073 expression, `(+ 3 3)', for which the value 6 is returned; then it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1074 evaluates the outer expression as if it were written `(+ 2 6)', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1075 returns the value 8. Since there are no more enclosing expressions to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1076 evaluate, the interpreter prints that value in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1077
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1078 Now it is easy to understand the name of the command invoked by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1079 keystrokes `C-x C-e': the name is `eval-last-sexp'. The letters
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1080 `sexp' are an abbreviation for `symbolic expression', and `eval' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1081 an abbreviation for `evaluate'. The command means `evaluate last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1082 symbolic expression'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1083
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1084 As an experiment, you can try evaluating the expression by putting the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1085 cursor at the beginning of the next line immediately following the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1086 expression, or inside the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1087
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1088 Here is another copy of the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1089
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1090 (+ 2 (+ 3 3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1091
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1092 If you place the cursor at the beginning of the blank line that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1093 immediately follows the expression and type `C-x C-e', you will still
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1094 get the value 8 printed in the echo area. Now try putting the cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1095 inside the expression. If you put it right after the next to last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1096 parenthesis (so it appears to sit on top of the last parenthesis),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1097 you will get a 6 printed in the echo area! This is because the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1098 command evaluates the expression `(+ 3 3)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1099
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1100 Now put the cursor immediately after a number. Type `C-x C-e' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1101 you will get the number itself. In Lisp, if you evaluate a number,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1102 you get the number itself--this is how numbers differ from symbols.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1103 If you evaluate a list starting with a symbol like `+', you will get a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1104 value returned that is the result of the computer carrying out the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1105 instructions in the function definition attached to that name. If a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1106 symbol by itself is evaluated, something different happens, as we will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1107 see in the next section.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1108
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1109 Variables
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1110 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1112 In Emacs Lisp, a symbol can have a value attached to it just as it can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1113 have a function definition attached to it. The two are different.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1114 The function definition is a set of instructions that a computer will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1115 obey. A value, on the other hand, is something, such as number or a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1116 name, that can vary (which is why such a symbol is called a variable).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1117 The value of a symbol can be any expression in Lisp, such as a symbol,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1118 number, list, or string. A symbol that has a value is often called a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1119 "variable".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1121 A symbol can have both a function definition and a value attached to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1122 it at the same time. Or it can have just one or the other. The two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1123 are separate. This is somewhat similar to the way the name Cambridge
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1124 can refer to the city in Massachusetts and have some information
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1125 attached to the name as well, such as "great programming center".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1126
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1127 Another way to think about this is to imagine a symbol as being a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1128 chest of drawers. The function definition is put in one drawer, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1129 value in another, and so on. What is put in the drawer holding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1130 value can be changed without affecting the contents of the drawer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1131 holding the function definition, and vice-versa.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1133 `fill-column', an Example Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1134 ----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1135
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1136 The variable `fill-column' illustrates a symbol with a value attached
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1137 to it: in every GNU Emacs buffer, this symbol is set to some value,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1138 usually 72 or 70, but sometimes to some other value. To find the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1139 value of this symbol, evaluate it by itself. If you are reading this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1140 in Info inside of GNU Emacs, you can do this by putting the cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1141 after the symbol and typing `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1142
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1143 fill-column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1144
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1145 After I typed `C-x C-e', Emacs printed the number 72 in my echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1146 This is the value for which `fill-column' is set for me as I write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1147 this. It may be different for you in your Info buffer. Notice that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1148 the value returned as a variable is printed in exactly the same way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1149 as the value returned by a function carrying out its instructions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1150 From the point of view of the Lisp interpreter, a value returned is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1151 value returned. What kind of expression it came from ceases to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1152 matter once the value is known.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1153
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1154 A symbol can have any value attached to it or, to use the jargon, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1155 can "bind" the variable to a value: to a number, such as 72; to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1156 string, `"such as this"'; to a list, such as `(spruce pine oak)'; we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1157 can even bind a variable to a function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1159 A symbol can be bound to a value in several ways. *Note Setting the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1160 Value of a Variable: set & setq, for information about one way to do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1161 this.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1162
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1163 Error Message for a Symbol Without a Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1164 ---------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1165
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1166 When we evaluated `fill-column' to find its value as a variable, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1167 did not place parentheses around the word. This is because we did
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1168 not intend to use it as a function name.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1169
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1170 If `fill-column' were the first or only element of a list, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1171 interpreter would attempt to find the function definition attached to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1172 it. But `fill-column' has no function definition. Try evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1173 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1174
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1175 (fill-column)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1176
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1177 In GNU Emacs version 21, you will create a `*Backtrace*' buffer that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1178 says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1179
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1180 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1181 Debugger entered--Lisp error: (void-function fill-column)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1182 (fill-column)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1183 eval((fill-column))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1184 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1185 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1186 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1187 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1188
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1189 (Remember, to quit the debugger and make the debugger window go away,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1190 type `q' in the `*Backtrace*' buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1191
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1192 In GNU Emacs 20 and before, you will produce an error message that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1193 says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1194
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1195 Symbol's function definition is void: fill-column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1197 (The message will go away away as soon as you move the cursor or type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1198 another key.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1199
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1200 Error Message for a Symbol Without a Value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1201 ------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1202
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1203 If you attempt to evaluate a symbol that does not have a value bound
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1204 to it, you will receive an error message. You can see this by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1205 experimenting with our 2 plus 2 addition. In the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1206 expression, put your cursor right after the `+', before the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1207 number 2, type `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1208
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1209 (+ 2 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1210
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1211 In GNU Emacs 21, you will create a `*Backtrace*' buffer that says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1213 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1214 Debugger entered--Lisp error: (void-variable +)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1215 eval(+)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1216 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1217 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1218 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1219 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1220
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1221 (As with the other times we entered the debugger, you can quit by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1222 typing `q' in the `*Backtrace*' buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1223
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1224 This backtrace is different from the very first error message we saw,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1225 which said, `Debugger entered--Lisp error: (void-function this)'. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1226 this case, the function does not have a value as a variable; while in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1227 the other error message, the function (the word `this') did not have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1228 a definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1229
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1230 In this experiment with the `+', what we did was cause the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1231 interpreter to evaluate the `+' and look for the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1232 variable instead of the function definition. We did this by placing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1233 the cursor right after the symbol rather than after the parenthesis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1234 of the enclosing list as we did before. As a consequence, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1235 interpreter evaluated the preceding s-expression, which in this case
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1236 was the `+' by itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1237
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1238 Since `+' does not have a value bound to it, just the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1239 definition, the error message reported that the symbol's value as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1240 variable was void.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1241
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1242 In GNU Emacs version 20 and before, your error message will say:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1243
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1244 Symbol's value as variable is void: +
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1245
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1246 The meaning is the same as in GNU Emacs 21.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1247
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1248 Arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1249 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1250
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1251 To see how information is passed to functions, let's look again at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1252 our old standby, the addition of two plus two. In Lisp, this is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1253 written as follows:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1254
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1255 (+ 2 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1256
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1257 If you evaluate this expression, the number 4 will appear in your echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1258 area. What the Lisp interpreter does is add the numbers that follow
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1259 the `+'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1260
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1261 The numbers added by `+' are called the "arguments" of the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1262 `+'. These numbers are the information that is given to or "passed"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1263 to the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1264
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1265 The word `argument' comes from the way it is used in mathematics and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1266 does not refer to a disputation between two people; instead it refers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1267 to the information presented to the function, in this case, to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1268 `+'. In Lisp, the arguments to a function are the atoms or lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1269 that follow the function. The values returned by the evaluation of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1270 these atoms or lists are passed to the function. Different functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1271 require different numbers of arguments; some functions require none at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1272 all.(1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1273
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1274 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1275
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1276 (1) It is curious to track the path by which the word `argument' came
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1277 to have two different meanings, one in mathematics and the other in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1278 everyday English. According to the `Oxford English Dictionary', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1279 word derives from the Latin for `to make clear, prove'; thus it came
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1280 to mean, by one thread of derivation, `the evidence offered as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1281 proof', which is to say, `the information offered', which led to its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1282 meaning in Lisp. But in the other thread of derivation, it came to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1283 mean `to assert in a manner against which others may make counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1284 assertions', which led to the meaning of the word as a disputation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1285 (Note here that the English word has two different definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1286 attached to it at the same time. By contrast, in Emacs Lisp, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1287 symbol cannot have two different function definitions at the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1288 time.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1289
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1290 Arguments' Data Types
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1291 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1293 The type of data that should be passed to a function depends on what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1294 kind of information it uses. The arguments to a function such as `+'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1295 must have values that are numbers, since `+' adds numbers. Other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1296 functions use different kinds of data for their arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1297
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1298 For example, the `concat' function links together or unites two or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1299 more strings of text to produce a string. The arguments are strings.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1300 Concatenating the two character strings `abc', `def' produces the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1301 single string `abcdef'. This can be seen by evaluating the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1302
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1303 (concat "abc" "def")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1304
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1305 The value produced by evaluating this expression is `"abcdef"'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1306
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1307 A function such as `substring' uses both a string and numbers as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1308 arguments. The function returns a part of the string, a substring of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1309 the first argument. This function takes three arguments. Its first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1310 argument is the string of characters, the second and third arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1311 are numbers that indicate the beginning and end of the substring. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1312 numbers are a count of the number of characters (including spaces and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1313 punctuations) from the beginning of the string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1314
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1315 For example, if you evaluate the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1316
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1317 (substring "The quick brown fox jumped." 16 19)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1318
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1319 you will see `"fox"' appear in the echo area. The arguments are the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1320 string and the two numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1321
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1322 Note that the string passed to `substring' is a single atom even
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1323 though it is made up of several words separated by spaces. Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1324 counts everything between the two quotation marks as part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1325 string, including the spaces. You can think of the `substring'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1326 function as a kind of `atom smasher' since it takes an otherwise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1327 indivisible atom and extracts a part. However, `substring' is only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1328 able to extract a substring from an argument that is a string, not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1329 from another type of atom such as a number or symbol.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1331 An Argument as the Value of a Variable or List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1332 ----------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1333
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1334 An argument can be a symbol that returns a value when it is evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1335 For example, when the symbol `fill-column' by itself is evaluated, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1336 returns a number. This number can be used in an addition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1337
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1338 Position the cursor after the following expression and type `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1339
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1340 (+ 2 fill-column)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1341
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1342 The value will be a number two more than what you get by evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1343 `fill-column' alone. For me, this is 74, because the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1344 `fill-column' is 72.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1345
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1346 As we have just seen, an argument can be a symbol that returns a value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1347 when evaluated. In addition, an argument can be a list that returns a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1348 value when it is evaluated. For example, in the following expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1349 the arguments to the function `concat' are the strings `"The "' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1350 `" red foxes."' and the list `(number-to-string (+ 2 fill-column))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1351
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1352 (concat "The " (number-to-string (+ 2 fill-column)) " red foxes.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1353
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1354 If you evaluate this expression--and if, as with my Emacs,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1355 `fill-column' evaluates to 72--`"The 74 red foxes."' will appear in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1356 the echo area. (Note that you must put spaces after the word `The'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1357 and before the word `red' so they will appear in the final string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1358 The function `number-to-string' converts the integer that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1359 addition function returns to a string. `number-to-string' is also
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1360 known as `int-to-string'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1361
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1362 Variable Number of Arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1363 ----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1364
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1365 Some functions, such as `concat', `+' or `*', take any number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1366 arguments. (The `*' is the symbol for multiplication.) This can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1367 seen by evaluating each of the following expressions in the usual
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1368 way. What you will see in the echo area is printed in this text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1369 after `=>', which you may read as `evaluates to'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1370
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1371 In the first set, the functions have no arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1372
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1373 (+) => 0
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1374
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1375 (*) => 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1376
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1377 In this set, the functions have one argument each:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1378
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1379 (+ 3) => 3
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1380
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1381 (* 3) => 3
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1382
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1383 In this set, the functions have three arguments each:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1384
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1385 (+ 3 4 5) => 12
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1386
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1387 (* 3 4 5) => 60
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1388
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1389 Using the Wrong Type Object as an Argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1390 ------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1391
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1392 When a function is passed an argument of the wrong type, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1393 interpreter produces an error message. For example, the `+' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1394 expects the values of its arguments to be numbers. As an experiment
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1395 we can pass it the quoted symbol `hello' instead of a number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1396 Position the cursor after the following expression and type `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1397
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1398 (+ 2 'hello)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1399
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1400 When you do this you will generate an error message. What has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1401 happened is that `+' has tried to add the 2 to the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1402 `'hello', but the value returned by `'hello' is the symbol `hello',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1403 not a number. Only numbers can be added. So `+' could not carry out
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1404 its addition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1405
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1406 In GNU Emacs version 21, you will create and enter a `*Backtrace*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1407 buffer that says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1408
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1409 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1410 Debugger entered--Lisp error:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1411 (wrong-type-argument number-or-marker-p hello)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1412 +(2 hello)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1413 eval((+ 2 (quote hello)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1414 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1415 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1416 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1417 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1418
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1419 As usual, the error message tries to be helpful and makes sense after
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1420 you learn how to read it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1421
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1422 The first part of the error message is straightforward; it says
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1423 `wrong type argument'. Next comes the mysterious jargon word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1424 `number-or-marker-p'. This word is trying to tell you what kind of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1425 argument the `+' expected.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1426
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1427 The symbol `number-or-marker-p' says that the Lisp interpreter is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1428 trying to determine whether the information presented it (the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1429 the argument) is a number or a marker (a special object representing a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1430 buffer position). What it does is test to see whether the `+' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1431 being given numbers to add. It also tests to see whether the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1432 argument is something called a marker, which is a specific feature of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1433 Emacs Lisp. (In Emacs, locations in a buffer are recorded as markers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1434 When the mark is set with the `C-@' or `C-<SPC>' command, its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1435 position is kept as a marker. The mark can be considered a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1436 number--the number of characters the location is from the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1437 of the buffer.) In Emacs Lisp, `+' can be used to add the numeric
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1438 value of marker positions as numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1440 The `p' of `number-or-marker-p' is the embodiment of a practice
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1441 started in the early days of Lisp programming. The `p' stands for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1442 `predicate'. In the jargon used by the early Lisp researchers, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1443 predicate refers to a function to determine whether some property is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1444 true or false. So the `p' tells us that `number-or-marker-p' is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1445 name of a function that determines whether it is true or false that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1446 the argument supplied is a number or a marker. Other Lisp symbols
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1447 that end in `p' include `zerop', a function that tests whether its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1448 argument has the value of zero, and `listp', a function that tests
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1449 whether its argument is a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1450
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1451 Finally, the last part of the error message is the symbol `hello'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1452 This is the value of the argument that was passed to `+'. If the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1453 addition had been passed the correct type of object, the value passed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1454 would have been a number, such as 37, rather than a symbol like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1455 `hello'. But then you would not have got the error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1456
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1457 In GNU Emacs version 20 and before, the echo area displays an error
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1458 message that says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1459
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1460 Wrong type argument: number-or-marker-p, hello
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1461
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1462 This says, in different words, the same as the top line of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1463 `*Backtrace*' buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1464
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1465 The `message' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1466 ----------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1467
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1468 Like `+', the `message' function takes a variable number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1469 arguments. It is used to send messages to the user and is so useful
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1470 that we will describe it here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1471
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1472 A message is printed in the echo area. For example, you can print a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1473 message in your echo area by evaluating the following list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1474
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1475 (message "This message appears in the echo area!")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1476
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1477 The whole string between double quotation marks is a single argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1478 and is printed in toto. (Note that in this example, the message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1479 itself will appear in the echo area within double quotes; that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1480 because you see the value returned by the `message' function. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1481 most uses of `message' in programs that you write, the text will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1482 printed in the echo area as a side-effect, without the quotes. *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1483 `multiply-by-seven' in detail: multiply-by-seven in detail, for an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1484 example of this.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1485
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1486 However, if there is a `%s' in the quoted string of characters, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1487 `message' function does not print the `%s' as such, but looks to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1488 argument that follows the string. It evaluates the second argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1489 and prints the value at the location in the string where the `%s' is.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1490
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1491 You can see this by positioning the cursor after the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1492 expression and typing `C-x C-e':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1494 (message "The name of this buffer is: %s." (buffer-name))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1495
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1496 In Info, `"The name of this buffer is: *info*."' will appear in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1497 echo area. The function `buffer-name' returns the name of the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1498 as a string, which the `message' function inserts in place of `%s'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1499
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1500 To print a value as an integer, use `%d' in the same way as `%s'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1501 For example, to print a message in the echo area that states the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1502 value of the `fill-column', evaluate the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1504 (message "The value of fill-column is %d." fill-column)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1505
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1506 On my system, when I evaluate this list, `"The value of fill-column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1507 is 72."' appears in my echo area(1).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1508
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1509 If there is more than one `%s' in the quoted string, the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1510 first argument following the quoted string is printed at the location
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1511 of the first `%s' and the value of the second argument is printed at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1512 the location of the second `%s', and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1513
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1514 For example, if you evaluate the following,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1515
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1516 (message "There are %d %s in the office!"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1517 (- fill-column 14) "pink elephants")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1518
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1519 a rather whimsical message will appear in your echo area. On my
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1520 system it says, `"There are 58 pink elephants in the office!"'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1521
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1522 The expression `(- fill-column 14)' is evaluated and the resulting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1523 number is inserted in place of the `%d'; and the string in double
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1524 quotes, `"pink elephants"', is treated as a single argument and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1525 inserted in place of the `%s'. (That is to say, a string between
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1526 double quotes evaluates to itself, like a number.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1527
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1528 Finally, here is a somewhat complex example that not only illustrates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1529 the computation of a number, but also shows how you can use an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1530 expression within an expression to generate the text that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1531 substituted for `%s':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1532
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1533 (message "He saw %d %s"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1534 (- fill-column 34)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1535 (concat "red "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1536 (substring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1537 "The quick brown foxes jumped." 16 21)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1538 " leaping."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1539
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1540 In this example, `message' has three arguments: the string, `"He saw
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1541 %d %s"', the expression, `(- fill-column 32)', and the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1542 beginning with the function `concat'. The value resulting from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1543 evaluation of `(- fill-column 32)' is inserted in place of the `%d';
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1544 and the value returned by the expression beginning with `concat' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1545 inserted in place of the `%s'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1546
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1547 When I evaluate the expression, the message `"He saw 38 red foxes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1548 leaping."' appears in my echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1549
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1550 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1551
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1552 (1) Actually, you can use `%s' to print a number. It is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1553 non-specific. `%d' prints only the part of a number left of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1554 decimal point, and not anything that is not a number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1555
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1556 Setting the Value of a Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1557 ===============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1558
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1559 There are several ways by which a variable can be given a value. One
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1560 of the ways is to use either the function `set' or the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1561 `setq'. Another way is to use `let' (*note let::). (The jargon for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1562 this process is to "bind" a variable to a value.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1563
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1564 The following sections not only describe how `set' and `setq' work
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1565 but also illustrate how arguments are passed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1566
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1567 Using `set'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1568 -----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1569
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1570 To set the value of the symbol `flowers' to the list `'(rose violet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1571 daisy buttercup)', evaluate the following expression by positioning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1572 the cursor after the expression and typing `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1573
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1574 (set 'flowers '(rose violet daisy buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1575
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1576 The list `(rose violet daisy buttercup)' will appear in the echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1577 area. This is what is _returned_ by the `set' function. As a side
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1578 effect, the symbol `flowers' is bound to the list ; that is, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1579 symbol `flowers', which can be viewed as a variable, is given the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1580 list as its value. (This process, by the way, illustrates how a side
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1581 effect to the Lisp interpreter, setting the value, can be the primary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1582 effect that we humans are interested in. This is because every Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1583 function must return a value if it does not get an error, but it will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1584 only have a side effect if it is designed to have one.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1585
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1586 After evaluating the `set' expression, you can evaluate the symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1587 `flowers' and it will return the value you just set. Here is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1588 symbol. Place your cursor after it and type `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1589
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1590 flowers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1591
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1592 When you evaluate `flowers', the list `(rose violet daisy buttercup)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1593 appears in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1594
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1595 Incidentally, if you evaluate `'flowers', the variable with a quote
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1596 in front of it, what you will see in the echo area is the symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1597 itself, `flowers'. Here is the quoted symbol, so you can try this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1598
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1599 'flowers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1600
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1601 Note also, that when you use `set', you need to quote both arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1602 to `set', unless you want them evaluated. Since we do not want
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1603 either argument evaluated, neither the variable `flowers' nor the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1604 list `(rose violet daisy buttercup)', both are quoted. (When you use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1605 `set' without quoting its first argument, the first argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1606 evaluated before anything else is done. If you did this and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1607 `flowers' did not have a value already, you would get an error
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1608 message that the `Symbol's value as variable is void'; on the other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1609 hand, if `flowers' did return a value after it was evaluated, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1610 `set' would attempt to set the value that was returned. There are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1611 situations where this is the right thing for the function to do; but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1612 such situations are rare.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1613
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1614 Using `setq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1615 ------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1616
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1617 As a practical matter, you almost always quote the first argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1618 `set'. The combination of `set' and a quoted first argument is so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1619 common that it has its own name: the special form `setq'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1620 special form is just like `set' except that the first argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1621 quoted automatically, so you don't need to type the quote mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1622 yourself. Also, as an added convenience, `setq' permits you to set
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1623 several different variables to different values, all in one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1624 expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1625
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1626 To set the value of the variable `carnivores' to the list `'(lion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1627 tiger leopard)' using `setq', the following expression is used:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1628
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1629 (setq carnivores '(lion tiger leopard))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1630
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1631 This is exactly the same as using `set' except the first argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1632 automatically quoted by `setq'. (The `q' in `setq' means `quote'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1633
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1634 With `set', the expression would look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1635
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1636 (set 'carnivores '(lion tiger leopard))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1637
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1638 Also, `setq' can be used to assign different values to different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1639 variables. The first argument is bound to the value of the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1640 argument, the third argument is bound to the value of the fourth
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1641 argument, and so on. For example, you could use the following to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1642 assign a list of trees to the symbol `trees' and a list of herbivores
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1643 to the symbol `herbivores':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1644
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1645 (setq trees '(pine fir oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1646 herbivores '(gazelle antelope zebra))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1647
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1648 (The expression could just as well have been on one line, but it might
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1649 not have fit on a page; and humans find it easier to read nicely
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1650 formatted lists.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1651
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1652 Although I have been using the term `assign', there is another way of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1653 thinking about the workings of `set' and `setq'; and that is to say
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1654 that `set' and `setq' make the symbol _point_ to the list. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1655 latter way of thinking is very common and in forthcoming chapters we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1656 shall come upon at least one symbol that has `pointer' as part of its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1657 name. The name is chosen because the symbol has a value,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1658 specifically a list, attached to it; or, expressed another way, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1659 symbol is set to "point" to the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1660
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1661 Counting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1662 --------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1663
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1664 Here is an example that shows how to use `setq' in a counter. You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1665 might use this to count how many times a part of your program repeats
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1666 itself. First set a variable to zero; then add one to the number each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1667 time the program repeats itself. To do this, you need a variable that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1668 serves as a counter, and two expressions: an initial `setq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1669 expression that sets the counter variable to zero; and a second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1670 `setq' expression that increments the counter each time it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1671 evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1672
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1673 (setq counter 0) ; Let's call this the initializer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1674
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1675 (setq counter (+ counter 1)) ; This is the incrementer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1676
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1677 counter ; This is the counter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1678
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1679 (The text following the `;' are comments. *Note Change a Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1680 Definition: Change a defun.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1681
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1682 If you evaluate the first of these expressions, the initializer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1683 `(setq counter 0)', and then evaluate the third expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1684 `counter', the number `0' will appear in the echo area. If you then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1685 evaluate the second expression, the incrementer, `(setq counter (+
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1686 counter 1))', the counter will get the value 1. So if you again
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1687 evaluate `counter', the number `1' will appear in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1688 Each time you evaluate the second expression, the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1689 counter will be incremented.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1690
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1691 When you evaluate the incrementer, `(setq counter (+ counter 1))',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1692 the Lisp interpreter first evaluates the innermost list; this is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1693 addition. In order to evaluate this list, it must evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1694 variable `counter' and the number `1'. When it evaluates the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1695 `counter', it receives its current value. It passes this value and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1696 the number `1' to the `+' which adds them together. The sum is then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1697 returned as the value of the inner list and passed to the `setq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1698 which sets the variable `counter' to this new value. Thus, the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1699 of the variable, `counter', is changed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1700
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1701 Summary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1702 =======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1703
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1704 Learning Lisp is like climbing a hill in which the first part is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1705 steepest. You have now climbed the most difficult part; what remains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1706 becomes easier as you progress onwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1707
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1708 In summary,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1709
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1710 * Lisp programs are made up of expressions, which are lists or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1711 single atoms.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1712
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1713 * Lists are made up of zero or more atoms or inner lists,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1714 separated by whitespace and surrounded by parentheses. A list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1715 can be empty.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1716
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1717 * Atoms are multi-character symbols, like `forward-paragraph',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1718 single character symbols like `+', strings of characters between
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1719 double quotation marks, or numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1720
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1721 * A number evaluates to itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1722
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1723 * A string between double quotes also evaluates to itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1724
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1725 * When you evaluate a symbol by itself, its value is returned.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1726
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1727 * When you evaluate a list, the Lisp interpreter looks at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1728 first symbol in the list and then at the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1729 bound to that symbol. Then the instructions in the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1730 definition are carried out.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1731
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1732 * A single-quote, `'', tells the Lisp interpreter that it should
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1733 return the following expression as written, and not evaluate it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1734 as it would if the quote were not there.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1735
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1736 * Arguments are the information passed to a function. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1737 arguments to a function are computed by evaluating the rest of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1738 the elements of the list of which the function is the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1739 element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1741 * A function always returns a value when it is evaluated (unless
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1742 it gets an error); in addition, it may also carry out some
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1743 action called a "side effect". In many cases, a function's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1744 primary purpose is to create a side effect.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1745
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1746 Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1747 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1748
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1749 A few simple exercises:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1750
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1751 * Generate an error message by evaluating an appropriate symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1752 that is not within parentheses.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1753
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1754 * Generate an error message by evaluating an appropriate symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1755 that is between parentheses.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1756
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1757 * Create a counter that increments by two rather than one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1758
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1759 * Write an expression that prints a message in the echo area when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1760 evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1761
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1762 Practicing Evaluation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1763 *********************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1764
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1765 Before learning how to write a function definition in Emacs Lisp, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1766 is useful to spend a little time evaluating various expressions that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1767 have already been written. These expressions will be lists with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1768 functions as their first (and often only) element. Since some of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1769 functions associated with buffers are both simple and interesting, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1770 will start with those. In this section, we will evaluate a few of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1771 these. In another section, we will study the code of several other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1772 buffer-related functions, to see how they were written.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1774 How to Evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1775 ===============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1776
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1777 Whenever you give an editing command to Emacs Lisp, such as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1778 command to move the cursor or to scroll the screen, you are evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1779 an expression, the first element of which is a function. This is how
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1780 Emacs works.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1782 When you type keys, you cause the Lisp interpreter to evaluate an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1783 expression and that is how you get your results. Even typing plain
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1784 text involves evaluating an Emacs Lisp function, in this case, one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1785 that uses `self-insert-command', which simply inserts the character
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1786 you typed. The functions you evaluate by typing keystrokes are called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1787 "interactive" functions, or "commands"; how you make a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1788 interactive will be illustrated in the chapter on how to write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1789 function definitions. *Note Making a Function Interactive:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1790 Interactive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1791
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1792 In addition to typing keyboard commands, we have seen a second way to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1793 evaluate an expression: by positioning the cursor after a list and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1794 typing `C-x C-e'. This is what we will do in the rest of this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1795 section. There are other ways to evaluate an expression as well;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1796 these will be described as we come to them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1797
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1798 Besides being used for practicing evaluation, the functions shown in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1799 the next few sections are important in their own right. A study of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1800 these functions makes clear the distinction between buffers and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1801 files, how to switch to a buffer, and how to determine a location
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1802 within it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1803
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1804 Buffer Names
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1805 ============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1806
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1807 The two functions, `buffer-name' and `buffer-file-name', show the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1808 difference between a file and a buffer. When you evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1809 following expression, `(buffer-name)', the name of the buffer appears
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1810 in the echo area. When you evaluate `(buffer-file-name)', the name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1811 of the file to which the buffer refers appears in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1812 Usually, the name returned by `(buffer-name)' is the same as the name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1813 of the file to which it refers, and the name returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1814 `(buffer-file-name)' is the full path-name of the file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1816 A file and a buffer are two different entities. A file is information
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1817 recorded permanently in the computer (unless you delete it). A
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1818 buffer, on the other hand, is information inside of Emacs that will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1819 vanish at the end of the editing session (or when you kill the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1820 buffer). Usually, a buffer contains information that you have copied
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1821 from a file; we say the buffer is "visiting" that file. This copy is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1822 what you work on and modify. Changes to the buffer do not change the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1823 file, until you save the buffer. When you save the buffer, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1824 buffer is copied to the file and is thus saved permanently.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1825
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1826 If you are reading this in Info inside of GNU Emacs, you can evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1827 each of the following expressions by positioning the cursor after it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1828 and typing `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1829
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1830 (buffer-name)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1831
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1832 (buffer-file-name)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1833
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1834 When I do this, `"introduction.texinfo"' is the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1835 evaluating `(buffer-name)', and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1836 `"/gnu/work/intro/introduction.texinfo"' is the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1837 evaluating `(buffer-file-name)'. The former is the name of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1838 buffer and the latter is the name of the file. (In the expressions,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1839 the parentheses tell the Lisp interpreter to treat `buffer-name' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1840 `buffer-file-name' as functions; without the parentheses, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1841 interpreter would attempt to evaluate the symbols as variables.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1842 *Note Variables::.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1843
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1844 In spite of the distinction between files and buffers, you will often
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1845 find that people refer to a file when they mean a buffer and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1846 vice-versa. Indeed, most people say, "I am editing a file," rather
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1847 than saying, "I am editing a buffer which I will soon save to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1848 file." It is almost always clear from context what people mean.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1849 When dealing with computer programs, however, it is important to keep
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1850 the distinction in mind, since the computer is not as smart as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1851 person.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1852
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1853 The word `buffer', by the way, comes from the meaning of the word as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1854 cushion that deadens the force of a collision. In early computers, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1855 buffer cushioned the interaction between files and the computer's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1856 central processing unit. The drums or tapes that held a file and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1857 central processing unit were pieces of equipment that were very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1858 different from each other, working at their own speeds, in spurts.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1859 The buffer made it possible for them to work together effectively.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1860 Eventually, the buffer grew from being an intermediary, a temporary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1861 holding place, to being the place where work is done. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1862 transformation is rather like that of a small seaport that grew into a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1863 great city: once it was merely the place where cargo was warehoused
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1864 temporarily before being loaded onto ships; then it became a business
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1865 and cultural center in its own right.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1866
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1867 Not all buffers are associated with files. For example, when you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1868 start an Emacs session by typing the command `emacs' alone, without
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1869 naming any files, Emacs will start with the `*scratch*' buffer on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1870 screen. This buffer is not visiting any file. Similarly, a `*Help*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1871 buffer is not associated with any file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1872
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1873 If you switch to the `*scratch*' buffer, type `(buffer-name)',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1874 position the cursor after it, and type `C-x C-e' to evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1875 expression, the name `"*scratch*"' is returned and will appear in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1876 echo area. `"*scratch*"' is the name of the buffer. However, if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1877 type `(buffer-file-name)' in the `*scratch*' buffer and evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1878 that, `nil' will appear in the echo area. `nil' is from the Latin
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1879 word for `nothing'; in this case, it means that the `*scratch*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1880 buffer is not associated with any file. (In Lisp, `nil' is also used
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1881 to mean `false' and is a synonym for the empty list, `()'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1883 Incidentally, if you are in the `*scratch*' buffer and want the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1884 returned by an expression to appear in the `*scratch*' buffer itself
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1885 rather than in the echo area, type `C-u C-x C-e' instead of `C-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1886 C-e'. This causes the value returned to appear after the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1887 The buffer will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1888
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1889 (buffer-name)"*scratch*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1890
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1891 You cannot do this in Info since Info is read-only and it will not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1892 allow you to change the contents of the buffer. But you can do this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1893 in any buffer you can edit; and when you write code or documentation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1894 (such as this book), this feature is very useful.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1895
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1896 Getting Buffers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1897 ===============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1898
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1899 The `buffer-name' function returns the _name_ of the buffer; to get
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1900 the buffer _itself_, a different function is needed: the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1901 `current-buffer' function. If you use this function in code, what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1902 you get is the buffer itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1903
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1904 A name and the object or entity to which the name refers are different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1905 from each other. You are not your name. You are a person to whom
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1906 others refer by name. If you ask to speak to George and someone
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1907 hands you a card with the letters `G', `e', `o', `r', `g', and `e'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1908 written on it, you might be amused, but you would not be satisfied.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1909 You do not want to speak to the name, but to the person to whom the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1910 name refers. A buffer is similar: the name of the scratch buffer is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1911 `*scratch*', but the name is not the buffer. To get a buffer itself,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1912 you need to use a function such as `current-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1913
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1914 However, there is a slight complication: if you evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1915 `current-buffer' in an expression on its own, as we will do here,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1916 what you see is a printed representation of the name of the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1917 without the contents of the buffer. Emacs works this way for two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1918 reasons: the buffer may be thousands of lines long--too long to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1919 conveniently displayed; and, another buffer may have the same contents
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1920 but a different name, and it is important to distinguish between them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1921
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1922 Here is an expression containing the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1923
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1924 (current-buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1925
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1926 If you evaluate the expression in the usual way, `#<buffer *info*>'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1927 appears in the echo area. The special format indicates that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1928 buffer itself is being returned, rather than just its name.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1929
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1930 Incidentally, while you can type a number or symbol into a program,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1931 you cannot do that with the printed representation of a buffer: the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1932 only way to get a buffer itself is with a function such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1933 `current-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1934
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1935 A related function is `other-buffer'. This returns the most recently
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1936 selected buffer other than the one you are in currently. If you have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1937 recently switched back and forth from the `*scratch*' buffer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1938 `other-buffer' will return that buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1939
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1940 You can see this by evaluating the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1941
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1942 (other-buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1943
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1944 You should see `#<buffer *scratch*>' appear in the echo area, or the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1945 name of whatever other buffer you switched back from most recently(1).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1946
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1947 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1948
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1949 (1) Actually, by default, if the buffer from which you just switched
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1950 is visible to you in another window, `other-buffer' will choose the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1951 most recent buffer that you cannot see; this is a subtlety that I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1952 often forget.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1953
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1954 Switching Buffers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1955 =================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1956
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1957 The `other-buffer' function actually provides a buffer when it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1958 used as an argument to a function that requires one. We can see this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1959 by using `other-buffer' and `switch-to-buffer' to switch to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1960 different buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1961
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1962 But first, a brief introduction to the `switch-to-buffer' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1963 When you switched back and forth from Info to the `*scratch*' buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1964 to evaluate `(buffer-name)', you most likely typed `C-x b' and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1965 typed `*scratch*'(1) when prompted in the minibuffer for the name of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1966 the buffer to which you wanted to switch. The keystrokes, `C-x b',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1967 cause the Lisp interpreter to evaluate the interactive function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1968 `switch-to-buffer'. As we said before, this is how Emacs works:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1969 different keystrokes call or run different functions. For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1970 `C-f' calls `forward-char', `M-e' calls `forward-sentence', and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1971
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1972 By writing `switch-to-buffer' in an expression, and giving it a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1973 buffer to switch to, we can switch buffers just the way `C-x b' does.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1974
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1975 Here is the Lisp expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1976
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1977 (switch-to-buffer (other-buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1978
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1979 The symbol `switch-to-buffer' is the first element of the list, so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1980 the Lisp interpreter will treat it as a function and carry out the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1981 instructions that are attached to it. But before doing that, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1982 interpreter will note that `other-buffer' is inside parentheses and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1983 work on that symbol first. `other-buffer' is the first (and in this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1984 case, the only) element of this list, so the Lisp interpreter calls
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1985 or runs the function. It returns another buffer. Next, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1986 interpreter runs `switch-to-buffer', passing to it, as an argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1987 the other buffer, which is what Emacs will switch to. If you are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1988 reading this in Info, try this now. Evaluate the expression. (To
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1989 get back, type `C-x b <RET>'.)(2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1990
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1991 In the programming examples in later sections of this document, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1992 will see the function `set-buffer' more often than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1993 `switch-to-buffer'. This is because of a difference between computer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1994 programs and humans: humans have eyes and expect to see the buffer on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1995 which they are working on their computer terminals. This is so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1996 obvious, it almost goes without saying. However, programs do not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1997 have eyes. When a computer program works on a buffer, that buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1998 does not need to be visible on the screen.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
1999
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2000 `switch-to-buffer' is designed for humans and does two different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2001 things: it switches the buffer to which Emacs' attention is directed;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2002 and it switches the buffer displayed in the window to the new buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2003 `set-buffer', on the other hand, does only one thing: it switches the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2004 attention of the computer program to a different buffer. The buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2005 on the screen remains unchanged (of course, normally nothing happens
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2006 there until the command finishes running).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2007
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2008 Also, we have just introduced another jargon term, the word "call".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2009 When you evaluate a list in which the first symbol is a function, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2010 are calling that function. The use of the term comes from the notion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2011 of the function as an entity that can do something for you if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2012 `call' it--just as a plumber is an entity who can fix a leak if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2013 call him or her.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2014
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2015 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2016
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2017 (1) Or rather, to save typing, you probably typed just part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2018 name, such as `*sc', and then pressed your `TAB' key to cause it to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2019 expand to the full name; and then typed your `RET' key.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2020
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2021 (2) Remember, this expression will move you to your most recent other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2022 buffer that you cannot see. If you really want to go to your most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2023 recently selected buffer, even if you can still see it, you need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2024 evaluate the following more complex expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2025
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2026 (switch-to-buffer (other-buffer (current-buffer) t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2027
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2028 In this case, the first argument to `other-buffer' tells it which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2029 buffer to skip--the current one--and the second argument tells
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2030 `other-buffer' it is OK to switch to a visible buffer. In regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2031 use, `switch-to-buffer' takes you to an invisible window since you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2032 would most likely use `C-x o' (`other-window') to go to another
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2033 visible buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2034
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2035 Buffer Size and the Location of Point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2036 =====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2037
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2038 Finally, let's look at several rather simple functions,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2039 `buffer-size', `point', `point-min', and `point-max'. These give
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2040 information about the size of a buffer and the location of point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2041 within it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2042
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2043 The function `buffer-size' tells you the size of the current buffer;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2044 that is, the function returns a count of the number of characters in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2045 the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2046
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2047 (buffer-size)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2048
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2049 You can evaluate this in the usual way, by positioning the cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2050 after the expression and typing `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2051
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2052 In Emacs, the current position of the cursor is called "point". The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2053 expression `(point)' returns a number that tells you where the cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2054 is located as a count of the number of characters from the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2055 of the buffer up to point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2056
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2057 You can see the character count for point in this buffer by evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2058 the following expression in the usual way:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2059
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2060 (point)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2062 As I write this, the value of `point' is 65724. The `point' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2063 is frequently used in some of the examples later in this book.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2064
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2065 The value of point depends, of course, on its location within the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2066 buffer. If you evaluate point in this spot, the number will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2067 larger:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2068
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2069 (point)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2070
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2071 For me, the value of point in this location is 66043, which means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2072 there are 319 characters (including spaces) between the two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2073 expressions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2074
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2075 The function `point-min' is somewhat similar to `point', but it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2076 returns the value of the minimum permissible value of point in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2077 current buffer. This is the number 1 unless "narrowing" is in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2078 effect. (Narrowing is a mechanism whereby you can restrict yourself,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2079 or a program, to operations on just a part of a buffer. *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2080 Narrowing and Widening: Narrowing & Widening.) Likewise, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2081 function `point-max' returns the value of the maximum permissible
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2082 value of point in the current buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2083
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2084 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2085 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2086
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2087 Find a file with which you are working and move towards its middle.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2088 Find its buffer name, file name, length, and your position in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2089 file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2090
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2091 How To Write Function Definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2092 *********************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2093
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2094 When the Lisp interpreter evaluates a list, it looks to see whether
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2095 the first symbol on the list has a function definition attached to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2096 it; or, put another way, whether the symbol points to a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2097 definition. If it does, the computer carries out the instructions in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2098 the definition. A symbol that has a function definition is called,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2099 simply, a function (although, properly speaking, the definition is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2100 the function and the symbol refers to it.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2101
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2102 An Aside about Primitive Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2103 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2104
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2105 All functions are defined in terms of other functions, except for a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2106 few "primitive" functions that are written in the C programming
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2107 language. When you write functions' definitions, you will write them
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2108 in Emacs Lisp and use other functions as your building blocks. Some
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2109 of the functions you will use will themselves be written in Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2110 Lisp (perhaps by you) and some will be primitives written in C. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2111 primitive functions are used exactly like those written in Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2112 and behave like them. They are written in C so we can easily run GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2113 Emacs on any computer that has sufficient power and can run C.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2114
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2115 Let me re-emphasize this: when you write code in Emacs Lisp, you do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2116 not distinguish between the use of functions written in C and the use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2117 of functions written in Emacs Lisp. The difference is irrelevant. I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2118 mention the distinction only because it is interesting to know.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2119 Indeed, unless you investigate, you won't know whether an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2120 already-written function is written in Emacs Lisp or C.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2121
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2122 The `defun' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2123 ========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2124
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2125 In Lisp, a symbol such as `mark-whole-buffer' has code attached to it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2126 that tells the computer what to do when the function is called. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2127 code is called the "function definition" and is created by evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2128 a Lisp expression that starts with the symbol `defun' (which is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2129 abbreviation for _define function_). Because `defun' does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2130 evaluate its arguments in the usual way, it is called a "special
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2131 form".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2133 In subsequent sections, we will look at function definitions from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2134 Emacs source code, such as `mark-whole-buffer'. In this section, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2135 will describe a simple function definition so you can see how it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2136 looks. This function definition uses arithmetic because it makes for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2137 a simple example. Some people dislike examples using arithmetic;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2138 however, if you are such a person, do not despair. Hardly any of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2139 code we will study in the remainder of this introduction involves
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2140 arithmetic or mathematics. The examples mostly involve text in one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2141 way or another.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2142
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2143 A function definition has up to five parts following the word `defun':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2144
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2145 1. The name of the symbol to which the function definition should be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2146 attached.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2147
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2148 2. A list of the arguments that will be passed to the function. If
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2149 no arguments will be passed to the function, this is an empty
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2150 list, `()'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2151
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2152 3. Documentation describing the function. (Technically optional,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2153 but strongly recommended.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2154
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2155 4. Optionally, an expression to make the function interactive so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2156 you can use it by typing `M-x' and then the name of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2157 function; or by typing an appropriate key or keychord.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2159 5. The code that instructs the computer what to do: the "body" of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2160 the function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2162 It is helpful to think of the five parts of a function definition as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2163 being organized in a template, with slots for each part:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2164
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2165 (defun FUNCTION-NAME (ARGUMENTS...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2166 "OPTIONAL-DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2167 (interactive ARGUMENT-PASSING-INFO) ; optional
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2168 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2169
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2170 As an example, here is the code for a function that multiplies its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2171 argument by 7. (This example is not interactive. *Note Making a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2172 Function Interactive: Interactive, for that information.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2173
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2174 (defun multiply-by-seven (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2175 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2176 (* 7 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2177
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2178 This definition begins with a parenthesis and the symbol `defun',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2179 followed by the name of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2180
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2181 The name of the function is followed by a list that contains the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2182 arguments that will be passed to the function. This list is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2183 the "argument list". In this example, the list has only one element,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2184 the symbol, `number'. When the function is used, the symbol will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2185 bound to the value that is used as the argument to the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2186
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2187 Instead of choosing the word `number' for the name of the argument, I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2188 could have picked any other name. For example, I could have chosen
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2189 the word `multiplicand'. I picked the word `number' because it tells
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2190 what kind of value is intended for this slot; but I could just as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2191 well have chosen the word `multiplicand' to indicate the role that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2192 value placed in this slot will play in the workings of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2193 I could have called it `foogle', but that would have been a bad
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2194 choice because it would not tell humans what it means. The choice of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2195 name is up to the programmer and should be chosen to make the meaning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2196 of the function clear.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2197
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2198 Indeed, you can choose any name you wish for a symbol in an argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2199 list, even the name of a symbol used in some other function: the name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2200 you use in an argument list is private to that particular definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2201 In that definition, the name refers to a different entity than any use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2202 of the same name outside the function definition. Suppose you have a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2203 nick-name `Shorty' in your family; when your family members refer to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2204 `Shorty', they mean you. But outside your family, in a movie, for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2205 example, the name `Shorty' refers to someone else. Because a name in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2206 an argument list is private to the function definition, you can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2207 change the value of such a symbol inside the body of a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2208 without changing its value outside the function. The effect is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2209 similar to that produced by a `let' expression. (*Note `let': let.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2210
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2211 The argument list is followed by the documentation string that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2212 describes the function. This is what you see when you type `C-h f'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2213 and the name of a function. Incidentally, when you write a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2214 documentation string like this, you should make the first line a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2215 complete sentence since some commands, such as `apropos', print only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2216 the first line of a multi-line documentation string. Also, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2217 should not indent the second line of a documentation string, if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2218 have one, because that looks odd when you use `C-h f'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2219 (`describe-function'). The documentation string is optional, but it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2220 is so useful, it should be included in almost every function you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2221 write.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2223 The third line of the example consists of the body of the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2224 definition. (Most functions' definitions, of course, are longer than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2225 this.) In this function, the body is the list, `(* 7 number)', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2226 says to multiply the value of NUMBER by 7. (In Emacs Lisp, `*' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2227 the function for multiplication, just as `+' is the function for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2228 addition.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2229
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2230 When you use the `multiply-by-seven' function, the argument `number'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2231 evaluates to the actual number you want used. Here is an example
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2232 that shows how `multiply-by-seven' is used; but don't try to evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2233 this yet!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2234
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2235 (multiply-by-seven 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2236
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2237 The symbol `number', specified in the function definition in the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2238 section, is given or "bound to" the value 3 in the actual use of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2239 function. Note that although `number' was inside parentheses in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2240 function definition, the argument passed to the `multiply-by-seven'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2241 function is not in parentheses. The parentheses are written in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2242 function definition so the computer can figure out where the argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2243 list ends and the rest of the function definition begins.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2244
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2245 If you evaluate this example, you are likely to get an error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2246 (Go ahead, try it!) This is because we have written the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2247 definition, but not yet told the computer about the definition--we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2248 have not yet installed (or `loaded') the function definition in Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2249 Installing a function is the process that tells the Lisp interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2250 the definition of the function. Installation is described in the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2251 section.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2252
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2253 Install a Function Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2254 =============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2255
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2256 If you are reading this inside of Info in Emacs, you can try out the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2257 `multiply-by-seven' function by first evaluating the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2258 definition and then evaluating `(multiply-by-seven 3)'. A copy of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2259 the function definition follows. Place the cursor after the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2260 parenthesis of the function definition and type `C-x C-e'. When you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2261 do this, `multiply-by-seven' will appear in the echo area. (What
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2262 this means is that when a function definition is evaluated, the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2263 it returns is the name of the defined function.) At the same time,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2264 this action installs the function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2265
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2266 (defun multiply-by-seven (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2267 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2268 (* 7 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2269
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2270 By evaluating this `defun', you have just installed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2271 `multiply-by-seven' in Emacs. The function is now just as much a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2272 part of Emacs as `forward-word' or any other editing function you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2273 use. (`multiply-by-seven' will stay installed until you quit Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2274 To reload code automatically whenever you start Emacs, see *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2275 Installing Code Permanently: Permanent Installation.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2276
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2277 The effect of installation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2278 --------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2279
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2280 You can see the effect of installing `multiply-by-seven' by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2281 evaluating the following sample. Place the cursor after the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2282 expression and type `C-x C-e'. The number 21 will appear in the echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2283 area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2284
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2285 (multiply-by-seven 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2286
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2287 If you wish, you can read the documentation for the function by typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2288 `C-h f' (`describe-function') and then the name of the function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2289 `multiply-by-seven'. When you do this, a `*Help*' window will appear
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2290 on your screen that says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2291
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2292 multiply-by-seven:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2293 Multiply NUMBER by seven.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2294
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2295 (To return to a single window on your screen, type `C-x 1'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2296
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2297 Change a Function Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2298 ----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2299
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2300 If you want to change the code in `multiply-by-seven', just rewrite
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2301 it. To install the new version in place of the old one, evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2302 function definition again. This is how you modify code in Emacs. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2303 is very simple.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2304
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2305 As an example, you can change the `multiply-by-seven' function to add
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2306 the number to itself seven times instead of multiplying the number by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2307 seven. It produces the same answer, but by a different path. At the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2308 same time, we will add a comment to the code; a comment is text that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2309 the Lisp interpreter ignores, but that a human reader may find useful
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2310 or enlightening. The comment is that this is the "second version".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2311
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2312 (defun multiply-by-seven (number) ; Second version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2313 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2314 (+ number number number number number number number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2315
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2316 The comment follows a semicolon, `;'. In Lisp, everything on a line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2317 that follows a semicolon is a comment. The end of the line is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2318 end of the comment. To stretch a comment over two or more lines,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2319 begin each line with a semicolon.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2320
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2321 *Note Beginning a `.emacs' File: Beginning a .emacs File, and *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2322 Comments: (elisp)Comments, for more about comments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2323
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2324 You can install this version of the `multiply-by-seven' function by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2325 evaluating it in the same way you evaluated the first function: place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2326 the cursor after the last parenthesis and type `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2327
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2328 In summary, this is how you write code in Emacs Lisp: you write a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2329 function; install it; test it; and then make fixes or enhancements and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2330 install it again.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2331
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2332 Make a Function Interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2333 ===========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2334
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2335 You make a function interactive by placing a list that begins with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2336 the special form `interactive' immediately after the documentation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2337 A user can invoke an interactive function by typing `M-x' and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2338 the name of the function; or by typing the keys to which it is bound,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2339 for example, by typing `C-n' for `next-line' or `C-x h' for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2340 `mark-whole-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2341
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2342 Interestingly, when you call an interactive function interactively,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2343 the value returned is not automatically displayed in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2344 This is because you often call an interactive function for its side
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2345 effects, such as moving forward by a word or line, and not for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2346 value returned. If the returned value were displayed in the echo area
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2347 each time you typed a key, it would be very distracting.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2348
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2349 An Interactive `multiply-by-seven', An Overview
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2350 -----------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2351
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2352 Both the use of the special form `interactive' and one way to display
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2353 a value in the echo area can be illustrated by creating an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2354 interactive version of `multiply-by-seven'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2355
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2356 Here is the code:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2357
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2358 (defun multiply-by-seven (number) ; Interactive version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2359 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2360 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2361 (message "The result is %d" (* 7 number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2362
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2363 You can install this code by placing your cursor after it and typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2364 `C-x C-e'. The name of the function will appear in your echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2365 Then, you can use this code by typing `C-u' and a number and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2366 typing `M-x multiply-by-seven' and pressing <RET>. The phrase `The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2367 result is ...' followed by the product will appear in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2368
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2369 Speaking more generally, you invoke a function like this in either of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2370 two ways:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2371
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2372 1. By typing a prefix argument that contains the number to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2373 passed, and then typing `M-x' and the name of the function, as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2374 with `C-u 3 M-x forward-sentence'; or,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2375
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2376 2. By typing whatever key or keychord the function is bound to, as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2377 with `C-u 3 M-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2378
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2379 Both the examples just mentioned work identically to move point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2380 forward three sentences. (Since `multiply-by-seven' is not bound to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2381 a key, it could not be used as an example of key binding.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2382
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2383 (*Note Some Keybindings: Keybindings, to learn how to bind a command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2384 to a key.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2385
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2386 A prefix argument is passed to an interactive function by typing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2387 <META> key followed by a number, for example, `M-3 M-e', or by typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2388 `C-u' and then a number, for example, `C-u 3 M-e' (if you type `C-u'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2389 without a number, it defaults to 4).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2390
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2391 An Interactive `multiply-by-seven'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2392 ----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2393
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2394 Let's look at the use of the special form `interactive' and then at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2395 the function `message' in the interactive version of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2396 `multiply-by-seven'. You will recall that the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2397 looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2398
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2399 (defun multiply-by-seven (number) ; Interactive version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2400 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2401 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2402 (message "The result is %d" (* 7 number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2403
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2404 In this function, the expression, `(interactive "p")', is a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2405 two elements. The `"p"' tells Emacs to pass the prefix argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2406 the function and use its value for the argument of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2407
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2408 The argument will be a number. This means that the symbol `number'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2409 will be bound to a number in the line:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2410
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2411 (message "The result is %d" (* 7 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2412
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2413 For example, if your prefix argument is 5, the Lisp interpreter will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2414 evaluate the line as if it were:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2415
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2416 (message "The result is %d" (* 7 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2417
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2418 (If you are reading this in GNU Emacs, you can evaluate this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2419 expression yourself.) First, the interpreter will evaluate the inner
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2420 list, which is `(* 7 5)'. This returns a value of 35. Next, it will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2421 evaluate the outer list, passing the values of the second and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2422 subsequent elements of the list to the function `message'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2423
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2424 As we have seen, `message' is an Emacs Lisp function especially
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2425 designed for sending a one line message to a user. (*Note The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2426 `message' function: message.) In summary, the `message' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2427 prints its first argument in the echo area as is, except for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2428 occurrences of `%d', `%s', or `%c'. When it sees one of these
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2429 control sequences, the function looks to the second and subsequent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2430 arguments and prints the value of the argument in the location in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2431 string where the control sequence is located.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2432
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2433 In the interactive `multiply-by-seven' function, the control string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2434 is `%d', which requires a number, and the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2435 evaluating `(* 7 5)' is the number 35. Consequently, the number 35
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2436 is printed in place of the `%d' and the message is `The result is 35'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2437
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2438 (Note that when you call the function `multiply-by-seven', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2439 message is printed without quotes, but when you call `message', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2440 text is printed in double quotes. This is because the value returned
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2441 by `message' is what appears in the echo area when you evaluate an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2442 expression whose first element is `message'; but when embedded in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2443 function, `message' prints the text as a side effect without quotes.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2444
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2445 Different Options for `interactive'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2446 ===================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2447
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2448 In the example, `multiply-by-seven' used `"p"' as the argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2449 `interactive'. This argument told Emacs to interpret your typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2450 either `C-u' followed by a number or <META> followed by a number as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2451 command to pass that number to the function as its argument. Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2452 has more than twenty characters predefined for use with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2453 `interactive'. In almost every case, one of these options will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2454 enable you to pass the right information interactively to a function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2455 (*Note Code Characters for `interactive': (elisp)Interactive Codes.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2456
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2457 For example, the character `r' causes Emacs to pass the beginning and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2458 end of the region (the current values of point and mark) to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2459 function as two separate arguments. It is used as follows:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2460
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2461 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2462
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2463 On the other hand, a `B' tells Emacs to ask for the name of a buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2464 that will be passed to the function. When it sees a `B', Emacs will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2465 ask for the name by prompting the user in the minibuffer, using a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2466 string that follows the `B', as in `"BAppend to buffer: "'. Not only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2467 will Emacs prompt for the name, but Emacs will complete the name if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2468 you type enough of it and press <TAB>.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2469
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2470 A function with two or more arguments can have information passed to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2471 each argument by adding parts to the string that follows
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2472 `interactive'. When you do this, the information is passed to each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2473 argument in the same order it is specified in the `interactive' list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2474 In the string, each part is separated from the next part by a `\n',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2475 which is a newline. For example, you could follow `"BAppend to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2476 buffer: "' with a `\n') and an `r'. This would cause Emacs to pass
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2477 the values of point and mark to the function as well as prompt you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2478 for the buffer--three arguments in all.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2479
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2480 In this case, the function definition would look like the following,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2481 where `buffer', `start', and `end' are the symbols to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2482 `interactive' binds the buffer and the current values of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2483 beginning and ending of the region:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2484
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2485 (defun NAME-OF-FUNCTION (buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2486 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2487 (interactive "BAppend to buffer: \nr")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2488 BODY-OF-FUNCTION...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2489
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2490 (The space after the colon in the prompt makes it look better when you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2491 are prompted. The `append-to-buffer' function looks exactly like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2492 this. *Note The Definition of `append-to-buffer': append-to-buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2494 If a function does not have arguments, then `interactive' does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2495 require any. Such a function contains the simple expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2496 `(interactive)'. The `mark-whole-buffer' function is like this.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2497
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2498 Alternatively, if the special letter-codes are not right for your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2499 application, you can pass your own arguments to `interactive' as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2500 list. *Note Using `Interactive': (elisp)interactive, for more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2501 information about this advanced technique.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2502
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2503 Install Code Permanently
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2504 ========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2505
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2506 When you install a function definition by evaluating it, it will stay
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2507 installed until you quit Emacs. The next time you start a new session
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2508 of Emacs, the function will not be installed unless you evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2509 function definition again.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2510
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2511 At some point, you may want to have code installed automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2512 whenever you start a new session of Emacs. There are several ways of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2513 doing this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2514
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2515 * If you have code that is just for yourself, you can put the code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2516 for the function definition in your `.emacs' initialization
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2517 file. When you start Emacs, your `.emacs' file is automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2518 evaluated and all the function definitions within it are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2519 installed. *Note Your `.emacs' File: Emacs Initialization.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2520
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2521 * Alternatively, you can put the function definitions that you want
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2522 installed in one or more files of their own and use the `load'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2523 function to cause Emacs to evaluate and thereby install each of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2524 the functions in the files. *Note Loading Files: Loading Files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2525
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2526 * On the other hand, if you have code that your whole site will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2527 use, it is usual to put it in a file called `site-init.el' that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2528 is loaded when Emacs is built. This makes the code available to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2529 everyone who uses your machine. (See the `INSTALL' file that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2530 part of the Emacs distribution.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2531
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2532 Finally, if you have code that everyone who uses Emacs may want, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2533 can post it on a computer network or send a copy to the Free Software
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2534 Foundation. (When you do this, please license the code and its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2535 documentation under a license that permits other people to run, copy,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2536 study, modify, and redistribute the code and which protects you from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2537 having your work taken from you.) If you send a copy of your code to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2538 the Free Software Foundation, and properly protect yourself and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2539 others, it may be included in the next release of Emacs. In large
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2540 part, this is how Emacs has grown over the past years, by donations.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2541
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2542 `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2543 =====
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2544
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2545 The `let' expression is a special form in Lisp that you will need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2546 use in most function definitions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2547
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2548 `let' is used to attach or bind a symbol to a value in such a way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2549 that the Lisp interpreter will not confuse the variable with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2550 variable of the same name that is not part of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2551
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2552 To understand why the `let' special form is necessary, consider the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2553 situation in which you own a home that you generally refer to as `the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2554 house', as in the sentence, "The house needs painting." If you are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2555 visiting a friend and your host refers to `the house', he is likely
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2556 to be referring to _his_ house, not yours, that is, to a different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2557 house.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2558
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2559 If your friend is referring to his house and you think he is referring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2560 to your house, you may be in for some confusion. The same thing could
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2561 happen in Lisp if a variable that is used inside of one function has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2562 the same name as a variable that is used inside of another function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2563 and the two are not intended to refer to the same value. The `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2564 special form prevents this kind of confusion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2565
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2566 `let' Prevents Confusion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2567 ------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2568
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2569 The `let' special form prevents confusion. `let' creates a name for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2570 a "local variable" that overshadows any use of the same name outside
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2571 the `let' expression. This is like understanding that whenever your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2572 host refers to `the house', he means his house, not yours. (Symbols
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2573 used in argument lists work the same way. *Note The `defun' Special
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2574 Form: defun.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2575
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2576 Local variables created by a `let' expression retain their value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2577 _only_ within the `let' expression itself (and within expressions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2578 called within the `let' expression); the local variables have no
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2579 effect outside the `let' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2580
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2581 Another way to think about `let' is that it is like a `setq' that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2582 temporary and local. The values set by `let' are automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2583 undone when the `let' is finished. The setting only affects
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2584 expressions that are inside the bounds of the `let' expression. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2585 computer science jargon, we would say "the binding of a symbol is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2586 visible only in functions called in the `let' form; in Emacs Lisp,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2587 scoping is dynamic, not lexical."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2588
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2589 `let' can create more than one variable at once. Also, `let' gives
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2590 each variable it creates an initial value, either a value specified
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2591 by you, or `nil'. (In the jargon, this is called `binding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2592 variable to the value'.) After `let' has created and bound the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2593 variables, it executes the code in the body of the `let', and returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2594 the value of the last expression in the body, as the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2595 whole `let' expression. (`Execute' is a jargon term that means to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2596 evaluate a list; it comes from the use of the word meaning `to give
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2597 practical effect to' (`Oxford English Dictionary'). Since you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2598 evaluate an expression to perform an action, `execute' has evolved as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2599 a synonym to `evaluate'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2600
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2601 The Parts of a `let' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2602 -------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2603
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2604 A `let' expression is a list of three parts. The first part is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2605 symbol `let'. The second part is a list, called a "varlist", each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2606 element of which is either a symbol by itself or a two-element list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2607 the first element of which is a symbol. The third part of the `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2608 expression is the body of the `let'. The body usually consists of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2609 one or more lists.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2610
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2611 A template for a `let' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2612
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2613 (let VARLIST BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2614
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2615 The symbols in the varlist are the variables that are given initial
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2616 values by the `let' special form. Symbols by themselves are given
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2617 the initial value of `nil'; and each symbol that is the first element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2618 of a two-element list is bound to the value that is returned when the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2619 Lisp interpreter evaluates the second element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2620
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2621 Thus, a varlist might look like this: `(thread (needles 3))'. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2622 this case, in a `let' expression, Emacs binds the symbol `thread' to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2623 an initial value of `nil', and binds the symbol `needles' to an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2624 initial value of 3.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2625
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2626 When you write a `let' expression, what you do is put the appropriate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2627 expressions in the slots of the `let' expression template.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2628
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2629 If the varlist is composed of two-element lists, as is often the case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2630 the template for the `let' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2631
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2632 (let ((VARIABLE VALUE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2633 (VARIABLE VALUE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2634 ...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2635 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2636
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2637 Sample `let' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2638 -----------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2639
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2640 The following expression creates and gives initial values to the two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2641 variables `zebra' and `tiger'. The body of the `let' expression is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2642 list which calls the `message' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2643
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2644 (let ((zebra 'stripes)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2645 (tiger 'fierce))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2646 (message "One kind of animal has %s and another is %s."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2647 zebra tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2648
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2649 Here, the varlist is `((zebra 'stripes) (tiger 'fierce))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2650
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2651 The two variables are `zebra' and `tiger'. Each variable is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2652 first element of a two-element list and each value is the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2653 element of its two-element list. In the varlist, Emacs binds the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2654 variable `zebra' to the value `stripes', and binds the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2655 `tiger' to the value `fierce'. In this example, both values are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2656 symbols preceded by a quote. The values could just as well have been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2657 another list or a string. The body of the `let' follows after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2658 list holding the variables. In this example, the body is a list that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2659 uses the `message' function to print a string in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2660
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2661 You may evaluate the example in the usual fashion, by placing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2662 cursor after the last parenthesis and typing `C-x C-e'. When you do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2663 this, the following will appear in the echo area:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2664
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2665 "One kind of animal has stripes and another is fierce."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2666
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2667 As we have seen before, the `message' function prints its first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2668 argument, except for `%s'. In this example, the value of the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2669 `zebra' is printed at the location of the first `%s' and the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2670 the variable `tiger' is printed at the location of the second `%s'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2671
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2672 Uninitialized Variables in a `let' Statement
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2673 --------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2674
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2675 If you do not bind the variables in a `let' statement to specific
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2676 initial values, they will automatically be bound to an initial value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2677 of `nil', as in the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2678
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2679 (let ((birch 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2680 pine
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2681 fir
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2682 (oak 'some))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2683 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2684 "Here are %d variables with %s, %s, and %s value."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2685 birch pine fir oak))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2686
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2687 Here, the varlist is `((birch 3) pine fir (oak 'some))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2688
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2689 If you evaluate this expression in the usual way, the following will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2690 appear in your echo area:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2691
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2692 "Here are 3 variables with nil, nil, and some value."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2693
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2694 In this example, Emacs binds the symbol `birch' to the number 3,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2695 binds the symbols `pine' and `fir' to `nil', and binds the symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2696 `oak' to the value `some'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2697
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2698 Note that in the first part of the `let', the variables `pine' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2699 `fir' stand alone as atoms that are not surrounded by parentheses;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2700 this is because they are being bound to `nil', the empty list. But
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2701 `oak' is bound to `some' and so is a part of the list `(oak 'some)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2702 Similarly, `birch' is bound to the number 3 and so is in a list with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2703 that number. (Since a number evaluates to itself, the number does
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2704 not need to be quoted. Also, the number is printed in the message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2705 using a `%d' rather than a `%s'.) The four variables as a group are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2706 put into a list to delimit them from the body of the `let'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2707
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2708 The `if' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2709 =====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2710
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2711 A third special form, in addition to `defun' and `let', is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2712 conditional `if'. This form is used to instruct the computer to make
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2713 decisions. You can write function definitions without using `if',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2714 but it is used often enough, and is important enough, to be included
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2715 here. It is used, for example, in the code for the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2716 `beginning-of-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2717
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2718 The basic idea behind an `if', is that "_if_ a test is true, _then_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2719 an expression is evaluated." If the test is not true, the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2720 is not evaluated. For example, you might make a decision such as,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2721 "if it is warm and sunny, then go to the beach!"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2722
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2723 `if' in more detail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2724 -------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2725
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2726 An `if' expression written in Lisp does not use the word `then'; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2727 test and the action are the second and third elements of the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2728 whose first element is `if'. Nonetheless, the test part of an `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2729 expression is often called the "if-part" and the second argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2730 often called the "then-part".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2731
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2732 Also, when an `if' expression is written, the true-or-false-test is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2733 usually written on the same line as the symbol `if', but the action
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2734 to carry out if the test is true, the "then-part", is written on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2735 second and subsequent lines. This makes the `if' expression easier
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2736 to read.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2737
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2738 (if TRUE-OR-FALSE-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2739 ACTION-TO-CARRY-OUT-IF-TEST-IS-TRUE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2741 The true-or-false-test will be an expression that is evaluated by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2742 Lisp interpreter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2743
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2744 Here is an example that you can evaluate in the usual manner. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2745 test is whether the number 5 is greater than the number 4. Since it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2746 is, the message `5 is greater than 4!' will be printed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2747
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2748 (if (> 5 4) ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2749 (message "5 is greater than 4!")) ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2750
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2751 (The function `>' tests whether its first argument is greater than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2752 its second argument and returns true if it is.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2753
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2754 Of course, in actual use, the test in an `if' expression will not be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2755 fixed for all time as it is by the expression `(> 5 4)'. Instead, at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2756 least one of the variables used in the test will be bound to a value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2757 that is not known ahead of time. (If the value were known ahead of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2758 time, we would not need to run the test!)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2759
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2760 For example, the value may be bound to an argument of a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2761 definition. In the following function definition, the character of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2762 the animal is a value that is passed to the function. If the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2763 bound to `characteristic' is `fierce', then the message, `It's a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2764 tiger!' will be printed; otherwise, `nil' will be returned.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2765
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2766 (defun type-of-animal (characteristic)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2767 "Print message in echo area depending on CHARACTERISTIC.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2768 If the CHARACTERISTIC is the symbol `fierce',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2769 then warn of a tiger."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2770 (if (equal characteristic 'fierce)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2771 (message "It's a tiger!")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2772
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2773 If you are reading this inside of GNU Emacs, you can evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2774 function definition in the usual way to install it in Emacs, and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2775 you can evaluate the following two expressions to see the results:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2776
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2777 (type-of-animal 'fierce)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2778
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2779 (type-of-animal 'zebra)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2780
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2781 When you evaluate `(type-of-animal 'fierce)', you will see the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2782 following message printed in the echo area: `"It's a tiger!"'; and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2783 when you evaluate `(type-of-animal 'zebra)' you will see `nil'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2784 printed in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2785
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2786 The `type-of-animal' Function in Detail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2787 ---------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2788
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2789 Let's look at the `type-of-animal' function in detail.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2790
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2791 The function definition for `type-of-animal' was written by filling
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2792 the slots of two templates, one for a function definition as a whole,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2793 and a second for an `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2794
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2795 The template for every function that is not interactive is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2797 (defun NAME-OF-FUNCTION (ARGUMENT-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2798 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2799 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2800
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2801 The parts of the function that match this template look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2802
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2803 (defun type-of-animal (characteristic)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2804 "Print message in echo area depending on CHARACTERISTIC.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2805 If the CHARACTERISTIC is the symbol `fierce',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2806 then warn of a tiger."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2807 BODY: THE `if' EXPRESSION)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2808
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2809 The name of function is `type-of-animal'; it is passed the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2810 one argument. The argument list is followed by a multi-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2811 documentation string. The documentation string is included in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2812 example because it is a good habit to write documentation string for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2813 every function definition. The body of the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2814 consists of the `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2816 The template for an `if' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2817
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2818 (if TRUE-OR-FALSE-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2819 ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2820
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2821 In the `type-of-animal' function, the code for the `if' looks like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2822 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2823
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2824 (if (equal characteristic 'fierce)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2825 (message "It's a tiger!")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2826
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2827 Here, the true-or-false-test is the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2828
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2829 (equal characteristic 'fierce)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2830
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2831 In Lisp, `equal' is a function that determines whether its first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2832 argument is equal to its second argument. The second argument is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2833 quoted symbol `'fierce' and the first argument is the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2834 symbol `characteristic'--in other words, the argument passed to this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2835 function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2836
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2837 In the first exercise of `type-of-animal', the argument `fierce' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2838 passed to `type-of-animal'. Since `fierce' is equal to `fierce', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2839 expression, `(equal characteristic 'fierce)', returns a value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2840 true. When this happens, the `if' evaluates the second argument or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2841 then-part of the `if': `(message "It's tiger!")'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2842
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2843 On the other hand, in the second exercise of `type-of-animal', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2844 argument `zebra' is passed to `type-of-animal'. `zebra' is not equal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2845 to `fierce', so the then-part is not evaluated and `nil' is returned
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2846 by the `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2847
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2848 If-then-else Expressions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2849 ========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2850
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2851 An `if' expression may have an optional third argument, called the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2852 "else-part", for the case when the true-or-false-test returns false.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2853 When this happens, the second argument or then-part of the overall
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2854 `if' expression is _not_ evaluated, but the third or else-part _is_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2855 evaluated. You might think of this as the cloudy day alternative for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2856 the decision `if it is warm and sunny, then go to the beach, else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2857 read a book!".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2858
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2859 The word "else" is not written in the Lisp code; the else-part of an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2860 `if' expression comes after the then-part. In the written Lisp, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2861 else-part is usually written to start on a line of its own and is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2862 indented less than the then-part:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2863
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2864 (if TRUE-OR-FALSE-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2865 ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-TRUE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2866 ACTION-TO-CARRY-OUT-IF-THE-TEST-RETURNS-FALSE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2867
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2868 For example, the following `if' expression prints the message `4 is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2869 not greater than 5!' when you evaluate it in the usual way:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2870
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2871 (if (> 4 5) ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2872 (message "5 is greater than 4!") ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2873 (message "4 is not greater than 5!")) ; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2874
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2875 Note that the different levels of indentation make it easy to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2876 distinguish the then-part from the else-part. (GNU Emacs has several
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2877 commands that automatically indent `if' expressions correctly. *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2878 GNU Emacs Helps You Type Lists: Typing Lists.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2879
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2880 We can extend the `type-of-animal' function to include an else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2881 by simply incorporating an additional part to the `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2883 You can see the consequences of doing this if you evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2884 following version of the `type-of-animal' function definition to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2885 install it and then evaluate the two subsequent expressions to pass
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2886 different arguments to the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2888 (defun type-of-animal (characteristic) ; Second version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2889 "Print message in echo area depending on CHARACTERISTIC.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2890 If the CHARACTERISTIC is the symbol `fierce',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2891 then warn of a tiger;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2892 else say it's not fierce."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2893 (if (equal characteristic 'fierce)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2894 (message "It's a tiger!")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2895 (message "It's not fierce!")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2896
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2897
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2898 (type-of-animal 'fierce)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2899
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2900 (type-of-animal 'zebra)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2901
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2902 When you evaluate `(type-of-animal 'fierce)', you will see the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2903 following message printed in the echo area: `"It's a tiger!"'; but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2904 when you evaluate `(type-of-animal 'zebra)', you will see `"It's not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2905 fierce!"'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2906
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2907 (Of course, if the CHARACTERISTIC were `ferocious', the message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2908 `"It's not fierce!"' would be printed; and it would be misleading!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2909 When you write code, you need to take into account the possibility
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2910 that some such argument will be tested by the `if' and write your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2911 program accordingly.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2912
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2913 Truth and Falsehood in Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2914 =================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2915
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2916 There is an important aspect to the truth test in an `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2917 So far, we have spoken of `true' and `false' as values of predicates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2918 as if they were new kinds of Emacs Lisp objects. In fact, `false' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2919 just our old friend `nil'. Anything else--anything at all--is `true'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2920
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2921 The expression that tests for truth is interpreted as "true" if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2922 result of evaluating it is a value that is not `nil'. In other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2923 words, the result of the test is considered true if the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2924 returned is a number such as 47, a string such as `"hello"', or a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2925 symbol (other than `nil') such as `flowers', or a list, or even a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2926 buffer!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2928 An explanation of `nil'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2929 -----------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2930
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2931 Before illustrating a test for truth, we need an explanation of `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2932
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2933 In Emacs Lisp, the symbol `nil' has two meanings. First, it means the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2934 empty list. Second, it means false and is the value returned when a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2935 true-or-false-test tests false. `nil' can be written as an empty
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2936 list, `()', or as `nil'. As far as the Lisp interpreter is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2937 concerned, `()' and `nil' are the same. Humans, however, tend to use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2938 `nil' for false and `()' for the empty list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2939
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2940 In Emacs Lisp, any value that is not `nil'--is not the empty list--is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2941 considered true. This means that if an evaluation returns something
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2942 that is not an empty list, an `if' expression will test true. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2943 example, if a number is put in the slot for the test, it will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2944 evaluated and will return itself, since that is what numbers do when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2945 evaluated. In this conditional, the `if' expression will test true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2946 The expression tests false only when `nil', an empty list, is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2947 returned by evaluating the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2948
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2949 You can see this by evaluating the two expressions in the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2950 examples.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2951
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2952 In the first example, the number 4 is evaluated as the test in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2953 `if' expression and returns itself; consequently, the then-part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2954 the expression is evaluated and returned: `true' appears in the echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2955 area. In the second example, the `nil' indicates false;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2956 consequently, the else-part of the expression is evaluated and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2957 returned: `false' appears in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2958
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2959 (if 4
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2960 'true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2961 'false)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2962
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2963 (if nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2964 'true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2965 'false)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2966
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2967 Incidentally, if some other useful value is not available for a test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2968 that returns true, then the Lisp interpreter will return the symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2969 `t' for true. For example, the expression `(> 5 4)' returns `t' when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2970 evaluated, as you can see by evaluating it in the usual way:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2971
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2972 (> 5 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2973
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2974 On the other hand, this function returns `nil' if the test is false.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2975
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2976 (> 4 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2977
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2978 `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2979 ================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2980
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2981 The `save-excursion' function is the fourth and final special form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2982 that we will discuss in this chapter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2983
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2984 In Emacs Lisp programs used for editing, the `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2985 function is very common. It saves the location of point and mark,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2986 executes the body of the function, and then restores point and mark to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2987 their previous positions if their locations were changed. Its primary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2988 purpose is to keep the user from being surprised and disturbed by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2989 unexpected movement of point or mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2990
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2991 Point and Mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2992 --------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2993
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2994 Before discussing `save-excursion', however, it may be useful first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2995 to review what point and mark are in GNU Emacs. "Point" is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2996 current location of the cursor. Wherever the cursor is, that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2997 point. More precisely, on terminals where the cursor appears to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2998 on top of a character, point is immediately before the character. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
2999 Emacs Lisp, point is an integer. The first character in a buffer is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3000 number one, the second is number two, and so on. The function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3001 `point' returns the current position of the cursor as a number. Each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3002 buffer has its own value for point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3003
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3004 The "mark" is another position in the buffer; its value can be set
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3005 with a command such as `C-<SPC>' (`set-mark-command'). If a mark has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3006 been set, you can use the command `C-x C-x'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3007 (`exchange-point-and-mark') to cause the cursor to jump to the mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3008 and set the mark to be the previous position of point. In addition,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3009 if you set another mark, the position of the previous mark is saved
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3010 in the mark ring. Many mark positions can be saved this way. You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3011 can jump the cursor to a saved mark by typing `C-u C-<SPC>' one or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3012 more times.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3013
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3014 The part of the buffer between point and mark is called "the region".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3015 Numerous commands work on the region, including `center-region',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3016 `count-lines-region', `kill-region', and `print-region'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3017
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3018 The `save-excursion' special form saves the locations of point and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3019 mark and restores those positions after the code within the body of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3020 the special form is evaluated by the Lisp interpreter. Thus, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3021 point were in the beginning of a piece of text and some code moved
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3022 point to the end of the buffer, the `save-excursion' would put point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3023 back to where it was before, after the expressions in the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3024 function were evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3025
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3026 In Emacs, a function frequently moves point as part of its internal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3027 workings even though a user would not expect this. For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3028 `count-lines-region' moves point. To prevent the user from being
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3029 bothered by jumps that are both unexpected and (from the user's point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3030 of view) unnecessary, `save-excursion' is often used to keep point and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3031 mark in the location expected by the user. The use of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3032 `save-excursion' is good housekeeping.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3033
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3034 To make sure the house stays clean, `save-excursion' restores the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3035 values of point and mark even if something goes wrong in the code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3036 inside of it (or, to be more precise and to use the proper jargon,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3037 "in case of abnormal exit"). This feature is very helpful.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3038
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3039 In addition to recording the values of point and mark,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3040 `save-excursion' keeps track of the current buffer, and restores it,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3041 too. This means you can write code that will change the buffer and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3042 have `save-excursion' switch you back to the original buffer. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3043 is how `save-excursion' is used in `append-to-buffer'. (*Note The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3044 Definition of `append-to-buffer': append-to-buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3045
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3046 Template for a `save-excursion' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3047 ------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3048
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3049 The template for code using `save-excursion' is simple:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3050
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3051 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3052 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3053
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3054 The body of the function is one or more expressions that will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3055 evaluated in sequence by the Lisp interpreter. If there is more than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3056 one expression in the body, the value of the last one will be returned
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3057 as the value of the `save-excursion' function. The other expressions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3058 in the body are evaluated only for their side effects; and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3059 `save-excursion' itself is used only for its side effect (which is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3060 restoring the positions of point and mark).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3062 In more detail, the template for a `save-excursion' expression looks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3063 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3064
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3065 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3066 FIRST-EXPRESSION-IN-BODY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3067 SECOND-EXPRESSION-IN-BODY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3068 THIRD-EXPRESSION-IN-BODY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3069 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3070 LAST-EXPRESSION-IN-BODY)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3072 An expression, of course, may be a symbol on its own or a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3073
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3074 In Emacs Lisp code, a `save-excursion' expression often occurs within
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3075 the body of a `let' expression. It looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3076
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3077 (let VARLIST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3078 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3079 BODY...))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3080
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3081 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3082 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3083
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3084 In the last few chapters we have introduced a fair number of functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3085 and special forms. Here they are described in brief, along with a few
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3086 similar functions that have not been mentioned yet.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3087
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3088 `eval-last-sexp'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3089 Evaluate the last symbolic expression before the current
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3090 location of point. The value is printed in the echo area unless
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3091 the function is invoked with an argument; in that case, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3092 output is printed in the current buffer. This command is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3093 normally bound to `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3094
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3095 `defun'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3096 Define function. This special form has up to five parts: the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3097 name, a template for the arguments that will be passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3098 function, documentation, an optional interactive declaration,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3099 and the body of the definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3101 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3102
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3103 (defun back-to-indentation ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3104 "Move point to first visible character on line."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3105 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3106 (beginning-of-line 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3107 (skip-chars-forward " \t"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3108
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3109 `interactive'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3110 Declare to the interpreter that the function can be used
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3111 interactively. This special form may be followed by a string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3112 with one or more parts that pass the information to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3113 arguments of the function, in sequence. These parts may also
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3114 tell the interpreter to prompt for information. Parts of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3115 string are separated by newlines, `\n'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3116
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3117 Common code characters are:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3118
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3119 `b'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3120 The name of an existing buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3121
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3122 `f'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3123 The name of an existing file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3124
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3125 `p'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3126 The numeric prefix argument. (Note that this `p' is lower
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3127 case.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3128
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3129 `r'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3130 Point and the mark, as two numeric arguments, smallest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3131 first. This is the only code letter that specifies two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3132 successive arguments rather than one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3133
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3134 *Note Code Characters for `interactive': (elisp)Interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3135 Codes, for a complete list of code characters.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3136
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3137 `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3138 Declare that a list of variables is for use within the body of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3139 the `let' and give them an initial value, either `nil' or a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3140 specified value; then evaluate the rest of the expressions in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3141 the body of the `let' and return the value of the last one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3142 Inside the body of the `let', the Lisp interpreter does not see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3143 the values of the variables of the same names that are bound
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3144 outside of the `let'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3145
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3146 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3147
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3148 (let ((foo (buffer-name))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3149 (bar (buffer-size)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3150 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3151 "This buffer is %s and has %d characters."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3152 foo bar))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3153
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3154 `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3155 Record the values of point and mark and the current buffer before
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3156 evaluating the body of this special form. Restore the values of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3157 point and mark and buffer afterward.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3159 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3160
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3161 (message "We are %d characters into this buffer."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3162 (- (point)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3163 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3164 (goto-char (point-min)) (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3165
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3166 `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3167 Evaluate the first argument to the function; if it is true,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3168 evaluate the second argument; else evaluate the third argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3169 if there is one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3170
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3171 The `if' special form is called a "conditional". There are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3172 other conditionals in Emacs Lisp, but `if' is perhaps the most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3173 commonly used.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3174
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3175 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3176
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3177 (if (string-equal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3178 (number-to-string 21)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3179 (substring (emacs-version) 10 12))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3180 (message "This is version 21 Emacs")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3181 (message "This is not version 21 Emacs"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3182
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3183 `equal'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3184 `eq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3185 Test whether two objects are the same. `equal' uses one meaning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3186 of the word `same' and `eq' uses another: `equal' returns true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3187 if the two objects have a similar structure and contents, such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3188 two copies of the same book. On the other hand, `eq', returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3189 true if both arguments are actually the same object.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3190
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3191 `<'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3192 `>'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3193 `<='
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3194 `>='
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3195 The `<' function tests whether its first argument is smaller than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3196 its second argument. A corresponding function, `>', tests
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3197 whether the first argument is greater than the second.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3198 Likewise, `<=' tests whether the first argument is less than or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3199 equal to the second and `>=' tests whether the first argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3200 greater than or equal to the second. In all cases, both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3201 arguments must be numbers or markers (markers indicate positions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3202 in buffers).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3203
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3204 `string<'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3205 `string-lessp'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3206 `string='
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3207 `string-equal'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3208 The `string-lessp' function tests whether its first argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3209 smaller than the second argument. A shorter, alternative name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3210 for the same function (a `defalias') is `string<'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3211
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3212 The arguments to `string-lessp' must be strings or symbols; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3213 ordering is lexicographic, so case is significant. The print
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3214 names of symbols are used instead of the symbols themselves.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3215
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3216 An empty string, `""', a string with no characters in it, is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3217 smaller than any string of characters.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3218
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3219 `string-equal' provides the corresponding test for equality. Its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3220 shorter, alternative name is `string='. There are no string test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3221 functions that correspond to >, `>=', or `<='.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3223 `message'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3224 Print a message in the echo area. The first argument is a string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3225 that can contain `%s', `%d', or `%c' to print the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3226 arguments that follow the string. The argument used by `%s' must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3227 be a string or a symbol; the argument used by `%d' must be a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3228 number. The argument used by `%c' must be an ascii code number;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3229 it will be printed as the character with that ASCII code.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3230
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3231 `setq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3232 `set'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3233 The `setq' function sets the value of its first argument to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3234 value of the second argument. The first argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3235 automatically quoted by `setq'. It does the same for succeeding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3236 pairs of arguments. Another function, `set', takes only two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3237 arguments and evaluates both of them before setting the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3238 returned by its first argument to the value returned by its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3239 second argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3241 `buffer-name'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3242 Without an argument, return the name of the buffer, as a string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3243
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3244 `buffer-file-name'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3245 Without an argument, return the name of the file the buffer is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3246 visiting.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3247
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3248 `current-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3249 Return the buffer in which Emacs is active; it may not be the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3250 buffer that is visible on the screen.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3251
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3252 `other-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3253 Return the most recently selected buffer (other than the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3254 passed to `other-buffer' as an argument and other than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3255 current buffer).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3256
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3257 `switch-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3258 Select a buffer for Emacs to be active in and display it in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3259 current window so users can look at it. Usually bound to `C-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3260 b'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3261
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3262 `set-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3263 Switch Emacs' attention to a buffer on which programs will run.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3264 Don't alter what the window is showing.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3265
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3266 `buffer-size'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3267 Return the number of characters in the current buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3268
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3269 `point'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3270 Return the value of the current position of the cursor, as an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3271 integer counting the number of characters from the beginning of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3272 the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3273
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3274 `point-min'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3275 Return the minimum permissible value of point in the current
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3276 buffer. This is 1, unless narrowing is in effect.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3277
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3278 `point-max'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3279 Return the value of the maximum permissible value of point in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3280 current buffer. This is the end of the buffer, unless narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3281 is in effect.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3282
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3283 Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3284 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3285
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3286 * Write a non-interactive function that doubles the value of its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3287 argument, a number. Make that function interactive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3288
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3289 * Write a function that tests whether the current value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3290 `fill-column' is greater than the argument passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3291 function, and if so, prints an appropriate message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3293 A Few Buffer-Related Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3294 ******************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3295
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3296 In this chapter we study in detail several of the functions used in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3297 GNU Emacs. This is called a "walk-through". These functions are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3298 used as examples of Lisp code, but are not imaginary examples; with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3299 the exception of the first, simplified function definition, these
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3300 functions show the actual code used in GNU Emacs. You can learn a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3301 great deal from these definitions. The functions described here are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3302 all related to buffers. Later, we will study other functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3303
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3304 Finding More Information
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3305 ========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3306
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3307 In this walk-through, I will describe each new function as we come to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3308 it, sometimes in detail and sometimes briefly. If you are interested,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3309 you can get the full documentation of any Emacs Lisp function at any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3310 time by typing `C-h f' and then the name of the function (and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3311 <RET>). Similarly, you can get the full documentation for a variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3312 by typing `C-h v' and then the name of the variable (and then <RET>).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3313
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3314 In versions 20 and higher, when a function is written in Emacs Lisp,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3315 `describe-function' will also tell you the location of the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3316 definition. If you move point over the file name and press the <RET>
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3317 key, which is this case means `help-follow' rather than `return' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3318 `enter', Emacs will take you directly to the function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3319
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3320 More generally, if you want to see a function in its original source
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3321 file, you can use the `find-tags' function to jump to it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3322 `find-tags' works with a wide variety of languages, not just Lisp,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3323 and C, and it works with non-programming text as well. For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3324 `find-tags' will jump to the various nodes in the Texinfo source file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3325 of this document.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3326
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3327 The `find-tags' function depends on `tags tables' that record the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3328 locations of the functions, variables, and other items to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3329 `find-tags' jumps.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3331 To use the `find-tags' command, type `M-.' (i.e., type the <META>
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3332 key and the period key at the same time, or else type the <ESC> key
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3333 and then type the period key), and then, at the prompt, type in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3334 name of the function whose source code you want to see, such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3335 `mark-whole-buffer', and then type <RET>. Emacs will switch buffers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3336 and display the source code for the function on your screen. To
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3337 switch back to your current buffer, type `C-x b <RET>'. (On some
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3338 keyboards, the <META> key is labelled <ALT>.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3339
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3340 Depending on how the initial default values of your copy of Emacs are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3341 set, you may also need to specify the location of your `tags table',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3342 which is a file called `TAGS'. For example, if you are interested in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3343 Emacs sources, the tags table you will most likely want, if it has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3344 already been created for you, will be in a subdirectory of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3345 `/usr/local/share/emacs/' directory; thus you would use the `M-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3346 visit-tags-table' command and specify a pathname such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3347 `/usr/local/share/emacs/21.0.100/lisp/TAGS' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3348 `/usr/local/src/emacs/lisp/TAGS'. If the tags table has not already
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3349 been created, you will have to create it yourself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3350
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3351 To create a `TAGS' file in a specific directory, switch to that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3352 directory in Emacs using `M-x cd' command, or list the directory with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3353 `C-x d' (`dired'). Then run the compile command, with `etags *.el'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3354 as the command to execute
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3355
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3356 M-x compile RET etags *.el RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3357
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3358 For more information, see *Note Create Your Own `TAGS' File: etags.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3359
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3360 After you become more familiar with Emacs Lisp, you will find that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3361 you will frequently use `find-tags' to navigate your way around
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3362 source code; and you will create your own `TAGS' tables.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3363
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3364 Incidentally, the files that contain Lisp code are conventionally
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3365 called "libraries". The metaphor is derived from that of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3366 specialized library, such as a law library or an engineering library,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3367 rather than a general library. Each library, or file, contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3368 functions that relate to a particular topic or activity, such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3369 `abbrev.el' for handling abbreviations and other typing shortcuts,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3370 and `help.el' for on-line help. (Sometimes several libraries provide
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3371 code for a single activity, as the various `rmail...' files provide
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3372 code for reading electronic mail.) In `The GNU Emacs Manual', you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3373 will see sentences such as "The `C-h p' command lets you search the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3374 standard Emacs Lisp libraries by topic keywords."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3375
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3376 A Simplified `beginning-of-buffer' Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3377 =============================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3378
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3379 The `beginning-of-buffer' command is a good function to start with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3380 since you are likely to be familiar with it and it is easy to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3381 understand. Used as an interactive command, `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3382 moves the cursor to the beginning of the buffer, leaving the mark at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3383 the previous position. It is generally bound to `M-<'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3384
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3385 In this section, we will discuss a shortened version of the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3386 that shows how it is most frequently used. This shortened function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3387 works as written, but it does not contain the code for a complex
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3388 option. In another section, we will describe the entire function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3389 (*Note Complete Definition of `beginning-of-buffer':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3390 beginning-of-buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3391
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3392 Before looking at the code, let's consider what the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3393 definition has to contain: it must include an expression that makes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3394 the function interactive so it can be called by typing `M-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3395 beginning-of-buffer' or by typing a keychord such as `M-<'; it must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3396 include code to leave a mark at the original position in the buffer;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3397 and it must include code to move the cursor to the beginning of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3398 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3399
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3400 Here is the complete text of the shortened version of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3401
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3402 (defun simplified-beginning-of-buffer ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3403 "Move point to the beginning of the buffer;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3404 leave mark at previous position."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3405 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3406 (push-mark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3407 (goto-char (point-min)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3408
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3409 Like all function definitions, this definition has five parts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3410 following the special form `defun':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3411
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3412 1. The name: in this example, `simplified-beginning-of-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3413
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3414 2. A list of the arguments: in this example, an empty list, `()',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3415
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3416 3. The documentation string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3417
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3418 4. The interactive expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3419
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3420 5. The body.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3421
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3422 In this function definition, the argument list is empty; this means
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3423 that this function does not require any arguments. (When we look at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3424 the definition for the complete function, we will see that it may be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3425 passed an optional argument.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3426
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3427 The interactive expression tells Emacs that the function is intended
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3428 to be used interactively. In this example, `interactive' does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3429 have an argument because `simplified-beginning-of-buffer' does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3430 require one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3431
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3432 The body of the function consists of the two lines:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3433
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3434 (push-mark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3435 (goto-char (point-min))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3436
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3437 The first of these lines is the expression, `(push-mark)'. When this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3438 expression is evaluated by the Lisp interpreter, it sets a mark at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3439 the current position of the cursor, wherever that may be. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3440 position of this mark is saved in the mark ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3441
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3442 The next line is `(goto-char (point-min))'. This expression jumps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3443 the cursor to the minimum point in the buffer, that is, to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3444 beginning of the buffer (or to the beginning of the accessible portion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3445 of the buffer if it is narrowed. *Note Narrowing and Widening:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3446 Narrowing & Widening.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3447
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3448 The `push-mark' command sets a mark at the place where the cursor was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3449 located before it was moved to the beginning of the buffer by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3450 `(goto-char (point-min))' expression. Consequently, you can, if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3451 wish, go back to where you were originally by typing `C-x C-x'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3452
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3453 That is all there is to the function definition!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3454
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3455 When you are reading code such as this and come upon an unfamiliar
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3456 function, such as `goto-char', you can find out what it does by using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3457 the `describe-function' command. To use this command, type `C-h f'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3458 and then type in the name of the function and press <RET>. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3459 `describe-function' command will print the function's documentation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3460 string in a `*Help*' window. For example, the documentation for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3461 `goto-char' is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3462
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3463 One arg, a number. Set point to that number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3464 Beginning of buffer is position (point-min),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3465 end is (point-max).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3466
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3467 (The prompt for `describe-function' will offer you the symbol under
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3468 or preceding the cursor, so you can save typing by positioning the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3469 cursor right over or after the function and then typing `C-h f
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3470 <RET>'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3471
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3472 The `end-of-buffer' function definition is written in the same way as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3473 the `beginning-of-buffer' definition except that the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3474 function contains the expression `(goto-char (point-max))' in place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3475 of `(goto-char (point-min))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3476
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3477 The Definition of `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3478 =====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3479
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3480 The `mark-whole-buffer' function is no harder to understand than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3481 `simplified-beginning-of-buffer' function. In this case, however, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3482 will look at the complete function, not a shortened version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3483
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3484 The `mark-whole-buffer' function is not as commonly used as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3485 `beginning-of-buffer' function, but is useful nonetheless: it marks a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3486 whole buffer as a region by putting point at the beginning and a mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3487 at the end of the buffer. It is generally bound to `C-x h'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3488
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3489 An overview of `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3490 ----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3491
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3492 In GNU Emacs 20, the code for the complete function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3494 (defun mark-whole-buffer ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3495 "Put point at beginning and mark at end of buffer."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3496 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3497 (push-mark (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3498 (push-mark (point-max))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3499 (goto-char (point-min)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3500
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3501 Like all other functions, the `mark-whole-buffer' function fits into
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3502 the template for a function definition. The template looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3504 (defun NAME-OF-FUNCTION (ARGUMENT-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3505 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3506 (INTERACTIVE-EXPRESSION...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3507 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3508
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3509 Here is how the function works: the name of the function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3510 `mark-whole-buffer'; it is followed by an empty argument list, `()',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3511 which means that the function does not require arguments. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3512 documentation comes next.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3513
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3514 The next line is an `(interactive)' expression that tells Emacs that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3515 the function will be used interactively. These details are similar
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3516 to the `simplified-beginning-of-buffer' function described in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3517 previous section.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3518
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3519 Body of `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3520 ---------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3521
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3522 The body of the `mark-whole-buffer' function consists of three lines
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3523 of code:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3524
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3525 (push-mark (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3526 (push-mark (point-max))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3527 (goto-char (point-min))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3528
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3529 The first of these lines is the expression, `(push-mark (point))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3530
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3531 This line does exactly the same job as the first line of the body of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3532 the `simplified-beginning-of-buffer' function, which is written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3533 `(push-mark)'. In both cases, the Lisp interpreter sets a mark at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3534 the current position of the cursor.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3535
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3536 I don't know why the expression in `mark-whole-buffer' is written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3537 `(push-mark (point))' and the expression in `beginning-of-buffer' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3538 written `(push-mark)'. Perhaps whoever wrote the code did not know
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3539 that the arguments for `push-mark' are optional and that if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3540 `push-mark' is not passed an argument, the function automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3541 sets mark at the location of point by default. Or perhaps the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3542 expression was written so as to parallel the structure of the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3543 line. In any case, the line causes Emacs to determine the position
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3544 of point and set a mark there.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3545
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3546 The next line of `mark-whole-buffer' is `(push-mark (point-max)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3547 This expression sets a mark at the point in the buffer that has the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3548 highest number. This will be the end of the buffer (or, if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3549 buffer is narrowed, the end of the accessible portion of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3550 *Note Narrowing and Widening: Narrowing & Widening, for more about
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3551 narrowing.) After this mark has been set, the previous mark, the one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3552 set at point, is no longer set, but Emacs remembers its position,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3553 just as all other recent marks are always remembered. This means
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3554 that you can, if you wish, go back to that position by typing `C-u
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3555 C-<SPC>' twice.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3556
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3557 (In GNU Emacs 21, the `(push-mark (point-max)' is slightly more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3558 complicated than shown here. The line reads
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3559
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3560 (push-mark (point-max) nil t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3561
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3562 (The expression works nearly the same as before. It sets a mark at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3563 the highest numbered place in the buffer that it can. However, in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3564 this version, `push-mark' has two additional arguments. The second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3565 argument to `push-mark' is `nil'. This tells the function it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3566 _should_ display a message that says `Mark set' when it pushes the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3567 mark. The third argument is `t'. This tells `push-mark' to activate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3568 the mark when Transient Mark mode is turned on. Transient Mark mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3569 highlights the currently active region. It is usually turned off.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3570
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3571 Finally, the last line of the function is `(goto-char (point-min)))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3572 This is written exactly the same way as it is written in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3573 `beginning-of-buffer'. The expression moves the cursor to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3574 minimum point in the buffer, that is, to the beginning of the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3575 (or to the beginning of the accessible portion of the buffer). As a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3576 result of this, point is placed at the beginning of the buffer and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3577 mark is set at the end of the buffer. The whole buffer is,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3578 therefore, the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3579
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3580 The Definition of `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3581 ====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3582
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3583 The `append-to-buffer' command is very nearly as simple as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3584 `mark-whole-buffer' command. What it does is copy the region (that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3585 is, the part of the buffer between point and mark) from the current
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3586 buffer to a specified buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3587
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3588 An Overview of `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3589 ---------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3590
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3591 The `append-to-buffer' command uses the `insert-buffer-substring'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3592 function to copy the region. `insert-buffer-substring' is described
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3593 by its name: it takes a string of characters from part of a buffer, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3594 "substring", and inserts them into another buffer. Most of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3595 `append-to-buffer' is concerned with setting up the conditions for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3596 `insert-buffer-substring' to work: the code must specify both the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3597 buffer to which the text will go and the region that will be copied.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3598 Here is the complete text of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3599
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3600 (defun append-to-buffer (buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3601 "Append to specified buffer the text of the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3602 It is inserted into that buffer before its point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3603
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3604 When calling from a program, give three arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3605 a buffer or the name of one, and two character numbers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3606 specifying the portion of the current buffer to be copied."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3607 (interactive "BAppend to buffer: \nr")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3608 (let ((oldbuf (current-buffer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3609 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3610 (set-buffer (get-buffer-create buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3611 (insert-buffer-substring oldbuf start end))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3612
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3613 The function can be understood by looking at it as a series of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3614 filled-in templates.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3615
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3616 The outermost template is for the function definition. In this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3617 function, it looks like this (with several slots filled in):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3618
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3619 (defun append-to-buffer (buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3620 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3621 (interactive "BAppend to buffer: \nr")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3622 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3623
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3624 The first line of the function includes its name and three arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3625 The arguments are the `buffer' to which the text will be copied, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3626 the `start' and `end' of the region in the current buffer that will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3627 be copied.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3628
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3629 The next part of the function is the documentation, which is clear and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3630 complete.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3631
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3632 The `append-to-buffer' Interactive Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3633 ---------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3634
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3635 Since the `append-to-buffer' function will be used interactively, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3636 function must have an `interactive' expression. (For a review of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3637 `interactive', see *Note Making a Function Interactive: Interactive.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3638 The expression reads as follows:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3639
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3640 (interactive "BAppend to buffer: \nr")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3641
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3642 This expression has an argument inside of quotation marks and that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3643 argument has two parts, separated by `\n'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3644
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3645 The first part is `BAppend to buffer: '. Here, the `B' tells Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3646 to ask for the name of the buffer that will be passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3647 function. Emacs will ask for the name by prompting the user in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3648 minibuffer, using the string following the `B', which is the string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3649 `Append to buffer: '. Emacs then binds the variable `buffer' in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3650 function's argument list to the specified buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3651
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3652 The newline, `\n', separates the first part of the argument from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3653 second part. It is followed by an `r' that tells Emacs to bind the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3654 two arguments that follow the symbol `buffer' in the function's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3655 argument list (that is, `start' and `end') to the values of point and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3656 mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3657
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3658 The Body of `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3659 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3660
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3661 The body of the `append-to-buffer' function begins with `let'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3662
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3663 As we have seen before (*note `let': let.), the purpose of a `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3664 expression is to create and give initial values to one or more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3665 variables that will only be used within the body of the `let'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3666 means that such a variable will not be confused with any variable of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3667 the same name outside the `let' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3668
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3669 We can see how the `let' expression fits into the function as a whole
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3670 by showing a template for `append-to-buffer' with the `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3671 expression in outline:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3672
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3673 (defun append-to-buffer (buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3674 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3675 (interactive "BAppend to buffer: \nr")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3676 (let ((VARIABLE VALUE))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3677 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3678
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3679 The `let' expression has three elements:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3680
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3681 1. The symbol `let';
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3682
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3683 2. A varlist containing, in this case, a single two-element list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3684 `(VARIABLE VALUE)';
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3685
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3686 3. The body of the `let' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3687
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3688 In the `append-to-buffer' function, the varlist looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3689
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3690 (oldbuf (current-buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3691
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3692 In this part of the `let' expression, the one variable, `oldbuf', is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3693 bound to the value returned by the `(current-buffer)' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3694 The variable, `oldbuf', is used to keep track of the buffer in which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3695 you are working and from which you will copy.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3696
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3697 The element or elements of a varlist are surrounded by a set of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3698 parentheses so the Lisp interpreter can distinguish the varlist from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3699 the body of the `let'. As a consequence, the two-element list within
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3700 the varlist is surrounded by a circumscribing set of parentheses.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3701 The line looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3702
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3703 (let ((oldbuf (current-buffer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3704 ... )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3705
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3706 The two parentheses before `oldbuf' might surprise you if you did not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3707 realize that the first parenthesis before `oldbuf' marks the boundary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3708 of the varlist and the second parenthesis marks the beginning of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3709 two-element list, `(oldbuf (current-buffer))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3710
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3711 `save-excursion' in `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3712 --------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3713
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3714 The body of the `let' expression in `append-to-buffer' consists of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3715 `save-excursion' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3716
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3717 The `save-excursion' function saves the locations of point and mark,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3718 and restores them to those positions after the expressions in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3719 body of the `save-excursion' complete execution. In addition,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3720 `save-excursion' keeps track of the original buffer, and restores it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3721 This is how `save-excursion' is used in `append-to-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3722
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3723 Incidentally, it is worth noting here that a Lisp function is normally
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3724 formatted so that everything that is enclosed in a multi-line spread
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3725 is indented more to the right than the first symbol. In this function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3726 definition, the `let' is indented more than the `defun', and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3727 `save-excursion' is indented more than the `let', like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3728
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3729 (defun ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3730 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3731 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3732 (let...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3733 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3734 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3735
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3736 This formatting convention makes it easy to see that the two lines in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3737 the body of the `save-excursion' are enclosed by the parentheses
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3738 associated with `save-excursion', just as the `save-excursion' itself
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3739 is enclosed by the parentheses associated with the `let':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3741 (let ((oldbuf (current-buffer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3742 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3743 (set-buffer (get-buffer-create buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3744 (insert-buffer-substring oldbuf start end))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3745
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3746 The use of the `save-excursion' function can be viewed as a process
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3747 of filling in the slots of a template:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3748
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3749 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3750 FIRST-EXPRESSION-IN-BODY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3751 SECOND-EXPRESSION-IN-BODY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3752 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3753 LAST-EXPRESSION-IN-BODY)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3754
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3755 In this function, the body of the `save-excursion' contains only two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3756 expressions. The body looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3757
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3758 (set-buffer (get-buffer-create buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3759 (insert-buffer-substring oldbuf start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3760
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3761 When the `append-to-buffer' function is evaluated, the two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3762 expressions in the body of the `save-excursion' are evaluated in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3763 sequence. The value of the last expression is returned as the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3764 of the `save-excursion' function; the other expression is evaluated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3765 only for its side effects.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3766
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3767 The first line in the body of the `save-excursion' uses the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3768 `set-buffer' function to change the current buffer to the one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3769 specified in the first argument to `append-to-buffer'. (Changing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3770 buffer is the side effect; as we have said before, in Lisp, a side
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3771 effect is often the primary thing we want.) The second line does the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3772 primary work of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3774 The `set-buffer' function changes Emacs' attention to the buffer to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3775 which the text will be copied and from which `save-excursion' will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3776 return.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3777
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3778 The line looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3779
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3780 (set-buffer (get-buffer-create buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3782 The innermost expression of this list is `(get-buffer-create
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3783 buffer)'. This expression uses the `get-buffer-create' function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3784 which either gets the named buffer, or if it does not exist, creates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3785 one with the given name. This means you can use `append-to-buffer' to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3786 put text into a buffer that did not previously exist.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3787
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3788 `get-buffer-create' also keeps `set-buffer' from getting an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3789 unnecessary error: `set-buffer' needs a buffer to go to; if you were
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3790 to specify a buffer that does not exist, Emacs would baulk. Since
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3791 `get-buffer-create' will create a buffer if none exists, `set-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3792 is always provided with a buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3794 The last line of `append-to-buffer' does the work of appending the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3795 text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3797 (insert-buffer-substring oldbuf start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3798
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3799 The `insert-buffer-substring' function copies a string _from_ the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3800 buffer specified as its first argument and inserts the string into
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3801 the present buffer. In this case, the argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3802 `insert-buffer-substring' is the value of the variable created and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3803 bound by the `let', namely the value of `oldbuf', which was the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3804 current buffer when you gave the `append-to-buffer' command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3805
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3806 After `insert-buffer-substring' has done its work, `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3807 will restore the action to the original buffer and `append-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3808 will have done its job.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3809
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3810 Written in skeletal form, the workings of the body look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3811
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3812 (let (BIND-`oldbuf'-TO-VALUE-OF-`current-buffer')
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3813 (save-excursion ; Keep track of buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3814 CHANGE-BUFFER
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3815 INSERT-SUBSTRING-FROM-`oldbuf'-INTO-BUFFER)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3816
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3817 CHANGE-BACK-TO-ORIGINAL-BUFFER-WHEN-FINISHED
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3818 LET-THE-LOCAL-MEANING-OF-`oldbuf'-DISAPPEAR-WHEN-FINISHED
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3819
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3820 In summary, `append-to-buffer' works as follows: it saves the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3821 of the current buffer in the variable called `oldbuf'. It gets the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3822 new buffer, creating one if need be, and switches Emacs to it. Using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3823 the value of `oldbuf', it inserts the region of text from the old
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3824 buffer into the new buffer; and then using `save-excursion', it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3825 brings you back to your original buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3826
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3827 In looking at `append-to-buffer', you have explored a fairly complex
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3828 function. It shows how to use `let' and `save-excursion', and how to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3829 change to and come back from another buffer. Many function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3830 definitions use `let', `save-excursion', and `set-buffer' this way.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3831
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3832 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3833 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3834
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3835 Here is a brief summary of the various functions discussed in this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3836 chapter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3838 `describe-function'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3839 `describe-variable'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3840 Print the documentation for a function or variable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3841 Conventionally bound to `C-h f' and `C-h v'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3842
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3843 `find-tag'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3844 Find the file containing the source for a function or variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3845 and switch buffers to it, positioning point at the beginning of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3846 the item. Conventionally bound to `M-.' (that's a period
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3847 following the <META> key).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3848
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3849 `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3850 Save the location of point and mark and restore their values
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3851 after the arguments to `save-excursion' have been evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3852 Also, remember the current buffer and return to it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3853
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3854 `push-mark'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3855 Set mark at a location and record the value of the previous mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3856 on the mark ring. The mark is a location in the buffer that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3857 will keep its relative position even if text is added to or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3858 removed from the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3859
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3860 `goto-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3861 Set point to the location specified by the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3862 argument, which can be a number, a marker, or an expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3863 that returns the number of a position, such as `(point-min)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3864
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3865 `insert-buffer-substring'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3866 Copy a region of text from a buffer that is passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3867 function as an argument and insert the region into the current
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3868 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3869
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3870 `mark-whole-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3871 Mark the whole buffer as a region. Normally bound to `C-x h'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3872
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3873 `set-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3874 Switch the attention of Emacs to another buffer, but do not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3875 change the window being displayed. Used when the program rather
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3876 than a human is to work on a different buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3877
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3878 `get-buffer-create'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3879 `get-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3880 Find a named buffer or create one if a buffer of that name does
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3881 not exist. The `get-buffer' function returns `nil' if the named
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3882 buffer does not exist.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3883
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3884 Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3885 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3886
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3887 * Write your own `simplified-end-of-buffer' function definition;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3888 then test it to see whether it works.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3889
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3890 * Use `if' and `get-buffer' to write a function that prints a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3891 message telling you whether a buffer exists.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3892
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3893 * Using `find-tag', find the source for the `copy-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3894 function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3895
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3896 A Few More Complex Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3897 ****************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3898
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3899 In this chapter, we build on what we have learned in previous chapters
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3900 by looking at more complex functions. The `copy-to-buffer' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3901 illustrates use of two `save-excursion' expressions in one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3902 definition, while the `insert-buffer' function illustrates use of an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3903 asterisk in an `interactive' expression, use of `or', and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3904 important distinction between a name and the object to which the name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3905 refers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3906
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3907 The Definition of `copy-to-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3908 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3909
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3910 After understanding how `append-to-buffer' works, it is easy to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3911 understand `copy-to-buffer'. This function copies text into a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3912 buffer, but instead of adding to the second buffer, it replaces the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3913 previous text in the second buffer. The code for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3914 `copy-to-buffer' function is almost the same as the code for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3915 `append-to-buffer', except that `erase-buffer' and a second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3916 `save-excursion' are used. (*Note The Definition of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3917 `append-to-buffer': append-to-buffer, for the description of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3918 `append-to-buffer'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3919
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3920 The body of `copy-to-buffer' looks like this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3921
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3922 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3923 (interactive "BCopy to buffer: \nr")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3924 (let ((oldbuf (current-buffer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3925 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3926 (set-buffer (get-buffer-create buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3927 (erase-buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3928 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3929 (insert-buffer-substring oldbuf start end)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3930
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3931 This code is similar to the code in `append-to-buffer': it is only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3932 after changing to the buffer to which the text will be copied that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3933 the definition for this function diverges from the definition for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3934 `append-to-buffer': the `copy-to-buffer' function erases the buffer's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3935 former contents. (This is what is meant by `replacement'; to replace
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3936 text, Emacs erases the previous text and then inserts new text.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3937 After erasing the previous contents of the buffer, `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3938 is used for a second time and the new text is inserted.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3939
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3940 Why is `save-excursion' used twice? Consider again what the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3941 does.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3942
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3943 In outline, the body of `copy-to-buffer' looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3944
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3945 (let (BIND-`oldbuf'-TO-VALUE-OF-`current-buffer')
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3946 (save-excursion ; First use of `save-excursion'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3947 CHANGE-BUFFER
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3948 (erase-buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3949 (save-excursion ; Second use of `save-excursion'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3950 INSERT-SUBSTRING-FROM-`oldbuf'-INTO-BUFFER)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3951
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3952 The first use of `save-excursion' returns Emacs to the buffer from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3953 which the text is being copied. That is clear, and is just like its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3954 use in `append-to-buffer'. Why the second use? The reason is that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3955 `insert-buffer-substring' always leaves point at the _end_ of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3956 region being inserted. The second `save-excursion' causes Emacs to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3957 leave point at the beginning of the text being inserted. In most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3958 circumstances, users prefer to find point at the beginning of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3959 inserted text. (Of course, the `copy-to-buffer' function returns the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3960 user to the original buffer when done--but if the user _then_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3961 switches to the copied-to buffer, point will go to the beginning of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3962 the text. Thus, this use of a second `save-excursion' is a little
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3963 nicety.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3964
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3965 The Definition of `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3966 =================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3967
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3968 `insert-buffer' is yet another buffer-related function. This command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3969 copies another buffer _into_ the current buffer. It is the reverse
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3970 of `append-to-buffer' or `copy-to-buffer', since they copy a region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3971 of text _from_ the current buffer to another buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3972
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3973 In addition, this code illustrates the use of `interactive' with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3974 buffer that might be "read-only" and the important distinction
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3975 between the name of an object and the object actually referred to.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3976
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3977 The Code for `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3978 ----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3979
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3980 Here is the code:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3981
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3982 (defun insert-buffer (buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3983 "Insert after point the contents of BUFFER.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3984 Puts mark after the inserted text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3985 BUFFER may be a buffer or a buffer name."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3986 (interactive "*bInsert buffer: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3987 (or (bufferp buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3988 (setq buffer (get-buffer buffer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3989 (let (start end newmark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3990 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3991 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3992 (set-buffer buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3993 (setq start (point-min) end (point-max)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3994 (insert-buffer-substring buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3995 (setq newmark (point)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3996 (push-mark newmark)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3997
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3998 As with other function definitions, you can use a template to see an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
3999 outline of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4000
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4001 (defun insert-buffer (buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4002 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4003 (interactive "*bInsert buffer: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4004 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4006 The Interactive Expression in `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4007 ---------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4008
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4009 In `insert-buffer', the argument to the `interactive' declaration has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4010 two parts, an asterisk, `*', and `bInsert buffer: '.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4011
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4012 A Read-only Buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4013 ..................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4014
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4015 The asterisk is for the situation when the current buffer is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4016 read-only buffer--a buffer that cannot be modified. If
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4017 `insert-buffer' is called when the current buffer is read-only, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4018 message to this effect is printed in the echo area and the terminal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4019 may beep or blink at you; you will not be permitted to insert anything
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4020 into current buffer. The asterisk does not need to be followed by a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4021 newline to separate it from the next argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4022
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4023 `b' in an Interactive Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4024 ................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4025
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4026 The next argument in the interactive expression starts with a lower
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4027 case `b'. (This is different from the code for `append-to-buffer',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4028 which uses an upper-case `B'. *Note The Definition of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4029 `append-to-buffer': append-to-buffer.) The lower-case `b' tells the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4030 Lisp interpreter that the argument for `insert-buffer' should be an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4031 existing buffer or else its name. (The upper-case `B' option
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4032 provides for the possibility that the buffer does not exist.) Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4033 will prompt you for the name of the buffer, offering you a default
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4034 buffer, with name completion enabled. If the buffer does not exist,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4035 you receive a message that says "No match"; your terminal may beep at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4036 you as well.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4037
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4038 The Body of the `insert-buffer' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4039 ----------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4040
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4041 The body of the `insert-buffer' function has two major parts: an `or'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4042 expression and a `let' expression. The purpose of the `or'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4043 expression is to ensure that the argument `buffer' is bound to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4044 buffer and not just the name of a buffer. The body of the `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4045 expression contains the code which copies the other buffer into the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4046 current buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4047
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4048 In outline, the two expressions fit into the `insert-buffer' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4049 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4050
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4051 (defun insert-buffer (buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4052 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4053 (interactive "*bInsert buffer: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4054 (or ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4055 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4056 (let (VARLIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4057 BODY-OF-`let'... )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4058
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4059 To understand how the `or' expression ensures that the argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4060 `buffer' is bound to a buffer and not to the name of a buffer, it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4061 first necessary to understand the `or' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4062
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4063 Before doing this, let me rewrite this part of the function using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4064 `if' so that you can see what is done in a manner that will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4065 familiar.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4066
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4067 `insert-buffer' With an `if' Instead of an `or'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4068 -----------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4069
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4070 The job to be done is to make sure the value of `buffer' is a buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4071 itself and not the name of a buffer. If the value is the name, then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4072 the buffer itself must be got.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4073
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4074 You can imagine yourself at a conference where an usher is wandering
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4075 around holding a list with your name on it and looking for you: the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4076 usher is "bound" to your name, not to you; but when the usher finds
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4077 you and takes your arm, the usher becomes "bound" to you.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4078
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4079 In Lisp, you might describe this situation like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4080
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4081 (if (not (holding-on-to-guest))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4082 (find-and-take-arm-of-guest))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4083
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4084 We want to do the same thing with a buffer--if we do not have the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4085 buffer itself, we want to get it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4086
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4087 Using a predicate called `bufferp' that tells us whether we have a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4088 buffer (rather than its name), we can write the code like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4089
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4090 (if (not (bufferp buffer)) ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4091 (setq buffer (get-buffer buffer))) ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4093 Here, the true-or-false-test of the `if' expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4094 `(not (bufferp buffer))'; and the then-part is the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4095 `(setq buffer (get-buffer buffer))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4096
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4097 In the test, the function `bufferp' returns true if its argument is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4098 buffer--but false if its argument is the name of the buffer. (The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4099 last character of the function name `bufferp' is the character `p';
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4100 as we saw earlier, such use of `p' is a convention that indicates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4101 that the function is a predicate, which is a term that means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4102 function will determine whether some property is true or false.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4103 *Note Using the Wrong Type Object as an Argument: Wrong Type of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4104 Argument.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4105
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4106 The function `not' precedes the expression `(bufferp buffer)', so the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4107 true-or-false-test looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4108
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4109 (not (bufferp buffer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4110
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4111 `not' is a function that returns true if its argument is false and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4112 false if its argument is true. So if `(bufferp buffer)' returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4113 true, the `not' expression returns false and vice-versa: what is "not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4114 true" is false and what is "not false" is true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4115
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4116 Using this test, the `if' expression works as follows: when the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4117 of the variable `buffer' is actually a buffer rather then its name,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4118 the true-or-false-test returns false and the `if' expression does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4119 evaluate the then-part. This is fine, since we do not need to do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4120 anything to the variable `buffer' if it really is a buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4121
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4122 On the other hand, when the value of `buffer' is not a buffer itself,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4123 but the name of a buffer, the true-or-false-test returns true and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4124 then-part of the expression is evaluated. In this case, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4125 then-part is `(setq buffer (get-buffer buffer))'. This expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4126 uses the `get-buffer' function to return an actual buffer itself,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4127 given its name. The `setq' then sets the variable `buffer' to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4128 value of the buffer itself, replacing its previous value (which was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4129 the name of the buffer).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4130
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4131 The `or' in the Body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4132 --------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4133
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4134 The purpose of the `or' expression in the `insert-buffer' function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4135 to ensure that the argument `buffer' is bound to a buffer and not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4136 just to the name of a buffer. The previous section shows how the job
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4137 could have been done using an `if' expression. However, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4138 `insert-buffer' function actually uses `or'. To understand this, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4139 is necessary to understand how `or' works.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4140
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4141 An `or' function can have any number of arguments. It evaluates each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4142 argument in turn and returns the value of the first of its arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4143 that is not `nil'. Also, and this is a crucial feature of `or', it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4144 does not evaluate any subsequent arguments after returning the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4145 non-`nil' value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4146
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4147 The `or' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4148
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4149 (or (bufferp buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4150 (setq buffer (get-buffer buffer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4151
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4152 The first argument to `or' is the expression `(bufferp buffer)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4153 This expression returns true (a non-`nil' value) if the buffer is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4154 actually a buffer, and not just the name of a buffer. In the `or'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4155 expression, if this is the case, the `or' expression returns this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4156 true value and does not evaluate the next expression--and this is fine
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4157 with us, since we do not want to do anything to the value of `buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4158 if it really is a buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4159
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4160 On the other hand, if the value of `(bufferp buffer)' is `nil', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4161 it will be if the value of `buffer' is the name of a buffer, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4162 interpreter evaluates the next element of the `or' expression. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4163 is the expression `(setq buffer (get-buffer buffer))'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4164 expression returns a non-`nil' value, which is the value to which it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4165 sets the variable `buffer'--and this value is a buffer itself, not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4166 the name of a buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4167
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4168 The result of all this is that the symbol `buffer' is always bound to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4169 a buffer itself rather than to the name of a buffer. All this is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4170 necessary because the `set-buffer' function in a following line only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4171 works with a buffer itself, not with the name to a buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4172
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4173 Incidentally, using `or', the situation with the usher would be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4174 written like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4175
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4176 (or (holding-on-to-guest) (find-and-take-arm-of-guest))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4177
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4178 The `let' Expression in `insert-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4179 ---------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4180
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4181 After ensuring that the variable `buffer' refers to a buffer itself
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4182 and not just to the name of a buffer, the `insert-buffer function'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4183 continues with a `let' expression. This specifies three local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4184 variables, `start', `end', and `newmark' and binds them to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4185 initial value `nil'. These variables are used inside the remainder
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4186 of the `let' and temporarily hide any other occurrence of variables
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4187 of the same name in Emacs until the end of the `let'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4188
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4189 The body of the `let' contains two `save-excursion' expressions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4190 First, we will look at the inner `save-excursion' expression in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4191 detail. The expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4192
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4193 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4194 (set-buffer buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4195 (setq start (point-min) end (point-max)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4197 The expression `(set-buffer buffer)' changes Emacs' attention from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4198 the current buffer to the one from which the text will copied. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4199 that buffer, the variables `start' and `end' are set to the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4200 and end of the buffer, using the commands `point-min' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4201 `point-max'. Note that we have here an illustration of how `setq' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4202 able to set two variables in the same expression. The first argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4203 of `setq' is set to the value of its second, and its third argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4204 is set to the value of its fourth.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4205
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4206 After the body of the inner `save-excursion' is evaluated, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4207 `save-excursion' restores the original buffer, but `start' and `end'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4208 remain set to the values of the beginning and end of the buffer from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4209 which the text will be copied.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4210
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4211 The outer `save-excursion' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4213 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4214 (INNER-`save-excursion'-EXPRESSION
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4215 (GO-TO-NEW-BUFFER-AND-SET-`start'-AND-`end')
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4216 (insert-buffer-substring buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4217 (setq newmark (point)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4218
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4219 The `insert-buffer-substring' function copies the text _into_ the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4220 current buffer _from_ the region indicated by `start' and `end' in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4221 `buffer'. Since the whole of the second buffer lies between `start'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4222 and `end', the whole of the second buffer is copied into the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4223 you are editing. Next, the value of point, which will be at the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4224 of the inserted text, is recorded in the variable `newmark'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4226 After the body of the outer `save-excursion' is evaluated, point and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4227 mark are relocated to their original places.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4228
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4229 However, it is convenient to locate a mark at the end of the newly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4230 inserted text and locate point at its beginning. The `newmark'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4231 variable records the end of the inserted text. In the last line of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4232 the `let' expression, the `(push-mark newmark)' expression function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4233 sets a mark to this location. (The previous location of the mark is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4234 still accessible; it is recorded on the mark ring and you can go back
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4235 to it with `C-u C-<SPC>'.) Meanwhile, point is located at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4236 beginning of the inserted text, which is where it was before you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4237 called the insert function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4238
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4239 The whole `let' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4241 (let (start end newmark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4242 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4243 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4244 (set-buffer buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4245 (setq start (point-min) end (point-max)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4246 (insert-buffer-substring buffer start end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4247 (setq newmark (point)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4248 (push-mark newmark))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4249
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4250 Like the `append-to-buffer' function, the `insert-buffer' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4251 uses `let', `save-excursion', and `set-buffer'. In addition, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4252 function illustrates one way to use `or'. All these functions are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4253 building blocks that we will find and use again and again.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4254
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4255 Complete Definition of `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4256 ============================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4257
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4258 The basic structure of the `beginning-of-buffer' function has already
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4259 been discussed. (*Note A Simplified `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4260 Definition: simplified-beginning-of-buffer.) This section describes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4261 the complex part of the definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4262
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4263 As previously described, when invoked without an argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4264 `beginning-of-buffer' moves the cursor to the beginning of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4265 buffer, leaving the mark at the previous position. However, when the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4266 command is invoked with a number between one and ten, the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4267 considers that number to be a fraction of the length of the buffer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4268 measured in tenths, and Emacs moves the cursor that fraction of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4269 way from the beginning of the buffer. Thus, you can either call this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4270 function with the key command `M-<', which will move the cursor to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4271 the beginning of the buffer, or with a key command such as `C-u 7
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4272 M-<' which will move the cursor to a point 70% of the way through the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4273 buffer. If a number bigger than ten is used for the argument, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4274 moves to the end of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4275
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4276 The `beginning-of-buffer' function can be called with or without an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4277 argument. The use of the argument is optional.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4278
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4279 Optional Arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4280 ------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4281
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4282 Unless told otherwise, Lisp expects that a function with an argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4283 in its function definition will be called with a value for that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4284 argument. If that does not happen, you get an error and a message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4285 that says `Wrong number of arguments'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4286
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4287 However, optional arguments are a feature of Lisp: a "keyword" may be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4288 used to tell the Lisp interpreter that an argument is optional. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4289 keyword is `&optional'. (The `&' in front of `optional' is part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4290 the keyword.) In a function definition, if an argument follows the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4291 keyword `&optional', a value does not need to be passed to that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4292 argument when the function is called.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4293
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4294 The first line of the function definition of `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4295 therefore looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4296
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4297 (defun beginning-of-buffer (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4298
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4299 In outline, the whole function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4300
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4301 (defun beginning-of-buffer (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4302 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4303 (interactive "P")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4304 (push-mark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4305 (goto-char
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4306 (IF-THERE-IS-AN-ARGUMENT
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4307 FIGURE-OUT-WHERE-TO-GO
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4308 ELSE-GO-TO
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4309 (point-min))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4310
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4311 The function is similar to the `simplified-beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4312 function except that the `interactive' expression has `"P"' as an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4313 argument and the `goto-char' function is followed by an if-then-else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4314 expression that figures out where to put the cursor if there is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4315 argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4316
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4317 The `"P"' in the `interactive' expression tells Emacs to pass a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4318 prefix argument, if there is one, to the function. A prefix argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4319 is made by typing the <META> key followed by a number, or by typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4320 `C-u' and then a number (if you don't type a number, `C-u' defaults
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4321 to 4).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4322
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4323 The true-or-false-test of the `if' expression is simple: it is simply
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4324 the argument `arg'. If `arg' has a value that is not `nil', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4325 will be the case if `beginning-of-buffer' is called with an argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4326 then this true-or-false-test will return true and the then-part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4327 the `if' expression will be evaluated. On the other hand, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4328 `beginning-of-buffer' is not called with an argument, the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4329 `arg' will be `nil' and the else-part of the `if' expression will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4330 evaluated. The else-part is simply `point-min', and when this is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4331 outcome, the whole `goto-char' expression is `(goto-char
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4332 (point-min))', which is how we saw the `beginning-of-buffer' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4333 in its simplified form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4334
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4335 `beginning-of-buffer' with an Argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4336 --------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4337
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4338 When `beginning-of-buffer' is called with an argument, an expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4339 is evaluated which calculates what value to pass to `goto-char'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4340 This expression is rather complicated at first sight. It includes an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4341 inner `if' expression and much arithmetic. It looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4342
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4343 (if (> (buffer-size) 10000)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4344 ;; Avoid overflow for large buffer sizes!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4345 (* (prefix-numeric-value arg) (/ (buffer-size) 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4346 (/
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4347 (+ 10
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4348 (*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4349 (buffer-size) (prefix-numeric-value arg))) 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4350
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4351 Disentangle `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4352 .................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4353
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4354 Like other complex-looking expressions, the conditional expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4355 within `beginning-of-buffer' can be disentangled by looking at it as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4356 parts of a template, in this case, the template for an if-then-else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4357 expression. In skeletal form, the expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4358
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4359 (if (BUFFER-IS-LARGE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4360 DIVIDE-BUFFER-SIZE-BY-10-AND-MULTIPLY-BY-ARG
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4361 ELSE-USE-ALTERNATE-CALCULATION
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4362
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4363 The true-or-false-test of this inner `if' expression checks the size
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4364 of the buffer. The reason for this is that the old Version 18 Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4365 used numbers that are no bigger than eight million or so and in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4366 computation that followed, the programmer feared that Emacs might try
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4367 to use over-large numbers if the buffer were large. The term
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4368 `overflow', mentioned in the comment, means numbers that are over
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4369 large. Version 21 Emacs uses larger numbers, but this code has not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4370 been touched, if only because people now look at buffers that are far,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4371 far larger than ever before.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4372
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4373 There are two cases: if the buffer is large and if it is not.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4374
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4375 What happens in a large buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4376 ..............................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4377
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4378 In `beginning-of-buffer', the inner `if' expression tests whether the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4379 size of the buffer is greater than 10,000 characters. To do this, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4380 uses the `>' function and the `buffer-size' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4381
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4382 The line looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4383
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4384 (if (> (buffer-size) 10000)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4385
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4386 When the buffer is large, the then-part of the `if' expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4387 evaluated. It reads like this (after formatting for easy reading):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4388
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4389 (*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4390 (prefix-numeric-value arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4391 (/ (buffer-size) 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4392
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4393 This expression is a multiplication, with two arguments to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4394 function `*'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4395
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4396 The first argument is `(prefix-numeric-value arg)'. When `"P"' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4397 used as the argument for `interactive', the value passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4398 function as its argument is passed a "raw prefix argument", and not a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4399 number. (It is a number in a list.) To perform the arithmetic, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4400 conversion is necessary, and `prefix-numeric-value' does the job.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4401
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4402 The second argument is `(/ (buffer-size) 10)'. This expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4403 divides the numeric value of the buffer by ten. This produces a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4404 number that tells how many characters make up one tenth of the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4405 size. (In Lisp, `/' is used for division, just as `*' is used for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4406 multiplication.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4407
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4408 In the multiplication expression as a whole, this amount is multiplied
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4409 by the value of the prefix argument--the multiplication looks like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4410 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4411
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4412 (* NUMERIC-VALUE-OF-PREFIX-ARG
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4413 NUMBER-OF-CHARACTERS-IN-ONE-TENTH-OF-THE-BUFFER)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4414
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4415 If, for example, the prefix argument is `7', the one-tenth value will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4416 be multiplied by 7 to give a position 70% of the way through the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4417 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4418
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4419 The result of all this is that if the buffer is large, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4420 `goto-char' expression reads like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4421
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4422 (goto-char (* (prefix-numeric-value arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4423 (/ (buffer-size) 10)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4424
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4425 This puts the cursor where we want it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4426
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4427 What happens in a small buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4428 ..............................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4429
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4430 If the buffer contains fewer than 10,000 characters, a slightly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4431 different computation is performed. You might think this is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4432 necessary, since the first computation could do the job. However, in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4433 a small buffer, the first method may not put the cursor on exactly the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4434 desired line; the second method does a better job.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4435
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4436 The code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4437
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4438 (/ (+ 10 (* (buffer-size) (prefix-numeric-value arg))) 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4440 This is code in which you figure out what happens by discovering how
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4441 the functions are embedded in parentheses. It is easier to read if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4442 you reformat it with each expression indented more deeply than its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4443 enclosing expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4444
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4445 (/
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4446 (+ 10
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4447 (*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4448 (buffer-size)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4449 (prefix-numeric-value arg)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4450 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4451
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4452 Looking at parentheses, we see that the innermost operation is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4453 `(prefix-numeric-value arg)', which converts the raw argument to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4454 number. This number is multiplied by the buffer size in the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4455 expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4456
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4457 (* (buffer-size) (prefix-numeric-value arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4458
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4459 This multiplication creates a number that may be larger than the size
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4460 of the buffer--seven times larger if the argument is 7, for example.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4461 Ten is then added to this number and finally the large number is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4462 divided by ten to provide a value that is one character larger than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4463 the percentage position in the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4464
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4465 The number that results from all this is passed to `goto-char' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4466 the cursor is moved to that point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4467
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4468 The Complete `beginning-of-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4469 ----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4470
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4471 Here is the complete text of the `beginning-of-buffer' function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4472
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4473 (defun beginning-of-buffer (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4474 "Move point to the beginning of the buffer;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4475 leave mark at previous position.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4476 With arg N, put point N/10 of the way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4477 from the true beginning.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4478 Don't use this in Lisp programs!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4479 \(goto-char (point-min)) is faster
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4480 and does not set the mark."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4481 (interactive "P")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4482 (push-mark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4483 (goto-char
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4484 (if arg
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4485 (if (> (buffer-size) 10000)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4486 ;; Avoid overflow for large buffer sizes!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4487 (* (prefix-numeric-value arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4488 (/ (buffer-size) 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4489 (/ (+ 10 (* (buffer-size)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4490 (prefix-numeric-value arg)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4491 10))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4492 (point-min)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4493 (if arg (forward-line 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4494
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4495 Except for two small points, the previous discussion shows how this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4496 function works. The first point deals with a detail in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4497 documentation string, and the second point concerns the last line of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4498 the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4499
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4500 In the documentation string, there is reference to an expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4501
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4502 \(goto-char (point-min))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4504 A `\' is used before the first parenthesis of this expression. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4505 `\' tells the Lisp interpreter that the expression should be printed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4506 as shown in the documentation rather than evaluated as a symbolic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4507 expression, which is what it looks like.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4508
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4509 Finally, the last line of the `beginning-of-buffer' command says to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4510 move point to the beginning of the next line if the command is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4511 invoked with an argument:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4512
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4513 (if arg (forward-line 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4514
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4515 This puts the cursor at the beginning of the first line after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4516 appropriate tenths position in the buffer. This is a flourish that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4517 means that the cursor is always located _at least_ the requested
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4518 tenths of the way through the buffer, which is a nicety that is,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4519 perhaps, not necessary, but which, if it did not occur, would be sure
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4520 to draw complaints.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4521
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4522 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4523 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4524
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4525 Here is a brief summary of some of the topics covered in this chapter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4526
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4527 `or'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4528 Evaluate each argument in sequence, and return the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4529 first argument that is not `nil'; if none return a value that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4530 not `nil', return `nil'. In brief, return the first true value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4531 of the arguments; return a true value if one _or_ any of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4532 other are true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4533
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4534 `and'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4535 Evaluate each argument in sequence, and if any are `nil', return
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4536 `nil'; if none are `nil', return the value of the last argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4537 In brief, return a true value only if all the arguments are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4538 true; return a true value if one _and_ each of the others is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4539 true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4540
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4541 `&optional'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4542 A keyword used to indicate that an argument to a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4543 definition is optional; this means that the function can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4544 evaluated without the argument, if desired.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4545
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4546 `prefix-numeric-value'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4547 Convert the `raw prefix argument' produced by `(interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4548 "P")' to a numeric value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4549
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4550 `forward-line'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4551 Move point forward to the beginning of the next line, or if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4552 argument is greater than one, forward that many lines. If it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4553 can't move as far forward as it is supposed to, `forward-line'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4554 goes forward as far as it can and then returns a count of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4555 number of additional lines it was supposed to move but couldn't.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4556
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4557 `erase-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4558 Delete the entire contents of the current buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4559
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4560 `bufferp'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4561 Return `t' if its argument is a buffer; otherwise return `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4562
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4563 `optional' Argument Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4564 ============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4565
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4566 Write an interactive function with an optional argument that tests
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4567 whether its argument, a number, is greater or less than the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4568 `fill-column', and tells you which, in a message. However, if you do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4569 not pass an argument to the function, use 56 as a default value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4570
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4571 Narrowing and Widening
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4572 **********************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4573
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4574 Narrowing is a feature of Emacs that makes it possible for you to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4575 focus on a specific part of a buffer, and work without accidentally
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4576 changing other parts. Narrowing is normally disabled since it can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4577 confuse novices.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4578
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4579 The Advantages of Narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4580 ===========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4581
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4582 With narrowing, the rest of a buffer is made invisible, as if it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4583 weren't there. This is an advantage if, for example, you want to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4584 replace a word in one part of a buffer but not in another: you narrow
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4585 to the part you want and the replacement is carried out only in that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4586 section, not in the rest of the buffer. Searches will only work
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4587 within a narrowed region, not outside of one, so if you are fixing a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4588 part of a document, you can keep yourself from accidentally finding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4589 parts you do not need to fix by narrowing just to the region you want.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4590 (The key binding for `narrow-to-region' is `C-x n n'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4591
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4592 However, narrowing does make the rest of the buffer invisible, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4593 can scare people who inadvertently invoke narrowing and think they
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4594 have deleted a part of their file. Moreover, the `undo' command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4595 (which is usually bound to `C-x u') does not turn off narrowing (nor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4596 should it), so people can become quite desperate if they do not know
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4597 that they can return the rest of a buffer to visibility with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4598 `widen' command. (The key binding for `widen' is `C-x n w'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4599
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4600 Narrowing is just as useful to the Lisp interpreter as to a human.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4601 Often, an Emacs Lisp function is designed to work on just part of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4602 buffer; or conversely, an Emacs Lisp function needs to work on all of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4603 a buffer that has been narrowed. The `what-line' function, for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4604 example, removes the narrowing from a buffer, if it has any narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4605 and when it has finished its job, restores the narrowing to what it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4606 was. On the other hand, the `count-lines' function, which is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4607 by `what-line', uses narrowing to restrict itself to just that portion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4608 of the buffer in which it is interested and then restores the previous
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4609 situation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4610
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4611 The `save-restriction' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4612 ===================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4613
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4614 In Emacs Lisp, you can use the `save-restriction' special form to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4615 keep track of whatever narrowing is in effect, if any. When the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4616 interpreter meets with `save-restriction', it executes the code in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4617 the body of the `save-restriction' expression, and then undoes any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4618 changes to narrowing that the code caused. If, for example, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4619 buffer is narrowed and the code that follows `save-restriction' gets
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4620 rid of the narrowing, `save-restriction' returns the buffer to its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4621 narrowed region afterwards. In the `what-line' command, any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4622 narrowing the buffer may have is undone by the `widen' command that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4623 immediately follows the `save-restriction' command. Any original
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4624 narrowing is restored just before the completion of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4625
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4626 The template for a `save-restriction' expression is simple:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4627
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4628 (save-restriction
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4629 BODY... )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4630
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4631 The body of the `save-restriction' is one or more expressions that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4632 will be evaluated in sequence by the Lisp interpreter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4633
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4634 Finally, a point to note: when you use both `save-excursion' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4635 `save-restriction', one right after the other, you should use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4636 `save-excursion' outermost. If you write them in reverse order, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4637 may fail to record narrowing in the buffer to which Emacs switches
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4638 after calling `save-excursion'. Thus, when written together,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4639 `save-excursion' and `save-restriction' should be written like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4640
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4641 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4642 (save-restriction
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4643 BODY...))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4644
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4645 In other circumstances, when not written together, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4646 `save-excursion' and `save-restriction' special forms must be written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4647 in the order appropriate to the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4648
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4649 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4650
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4651 (save-restriction
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4652 (widen)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4653 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4654 BODY...))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4655
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4656 `what-line'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4657 ===========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4658
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4659 The `what-line' command tells you the number of the line in which the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4660 cursor is located. The function illustrates the use of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4661 `save-restriction' and `save-excursion' commands. Here is the text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4662 of the function in full:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4663
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4664 (defun what-line ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4665 "Print the current line number (in the buffer) of point."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4666 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4667 (save-restriction
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4668 (widen)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4669 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4670 (beginning-of-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4671 (message "Line %d"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4672 (1+ (count-lines 1 (point)))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4673
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4674 The function has a documentation line and is interactive, as you would
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4675 expect. The next two lines use the functions `save-restriction' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4676 `widen'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4677
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4678 The `save-restriction' special form notes whatever narrowing is in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4679 effect, if any, in the current buffer and restores that narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4680 after the code in the body of the `save-restriction' has been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4681 evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4682
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4683 The `save-restriction' special form is followed by `widen'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4684 function undoes any narrowing the current buffer may have had when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4685 `what-line' was called. (The narrowing that was there is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4686 narrowing that `save-restriction' remembers.) This widening makes it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4687 possible for the line counting commands to count from the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4688 of the buffer. Otherwise, they would have been limited to counting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4689 within the accessible region. Any original narrowing is restored
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4690 just before the completion of the function by the `save-restriction'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4691 special form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4692
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4693 The call to `widen' is followed by `save-excursion', which saves the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4694 location of the cursor (i.e., of point) and of the mark, and restores
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4695 them after the code in the body of the `save-excursion' uses the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4696 `beginning-of-line' function to move point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4697
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4698 (Note that the `(widen)' expression comes between the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4699 `save-restriction' and `save-excursion' special forms. When you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4700 write the two `save- ...' expressions in sequence, write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4701 `save-excursion' outermost.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4702
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4703 The last two lines of the `what-line' function are functions to count
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4704 the number of lines in the buffer and then print the number in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4705 echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4706
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4707 (message "Line %d"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4708 (1+ (count-lines 1 (point)))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4709
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4710 The `message' function prints a one-line message at the bottom of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4711 Emacs screen. The first argument is inside of quotation marks and is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4712 printed as a string of characters. However, it may contain `%d',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4713 `%s', or `%c' to print arguments that follow the string. `%d' prints
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4714 the argument as a decimal, so the message will say something such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4715 `Line 243'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4716
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4717 The number that is printed in place of the `%d' is computed by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4718 last line of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4719
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4720 (1+ (count-lines 1 (point)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4721
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4722 What this does is count the lines from the first position of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4723 buffer, indicated by the `1', up to `(point)', and then add one to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4724 that number. (The `1+' function adds one to its argument.) We add
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4725 one to it because line 2 has only one line before it, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4726 `count-lines' counts only the lines _before_ the current line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4727
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4728 After `count-lines' has done its job, and the message has been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4729 printed in the echo area, the `save-excursion' restores point and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4730 mark to their original positions; and `save-restriction' restores the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4731 original narrowing, if any.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4732
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4733 Exercise with Narrowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4734 =======================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4735
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4736 Write a function that will display the first 60 characters of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4737 current buffer, even if you have narrowed the buffer to its latter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4738 half so that the first line is inaccessible. Restore point, mark,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4739 and narrowing. For this exercise, you need to use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4740 `save-restriction', `widen', `goto-char', `point-min',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4741 `buffer-substring', `message', and other functions, a whole potpourri.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4742
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4743 `car', `cdr', `cons': Fundamental Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4744 *******************************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4745
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4746 In Lisp, `car', `cdr', and `cons' are fundamental functions. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4747 `cons' function is used to construct lists, and the `car' and `cdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4748 functions are used to take them apart.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4749
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4750 In the walk through of the `copy-region-as-kill' function, we will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4751 see `cons' as well as two variants on `cdr', namely, `setcdr' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4752 `nthcdr'. (*Note copy-region-as-kill::.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4753
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4754 Strange Names
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4755 =============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4756
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4757 The name of the `cons' function is not unreasonable: it is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4758 abbreviation of the word `construct'. The origins of the names for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4759 `car' and `cdr', on the other hand, are esoteric: `car' is an acronym
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4760 from the phrase `Contents of the Address part of the Register'; and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4761 `cdr' (pronounced `could-er') is an acronym from the phrase `Contents
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4762 of the Decrement part of the Register'. These phrases refer to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4763 specific pieces of hardware on the very early computer on which the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4764 original Lisp was developed. Besides being obsolete, the phrases
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4765 have been completely irrelevant for more than 25 years to anyone
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4766 thinking about Lisp. Nonetheless, although a few brave scholars have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4767 begun to use more reasonable names for these functions, the old terms
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4768 are still in use. In particular, since the terms are used in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4769 Emacs Lisp source code, we will use them in this introduction.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4770
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4771 `car' and `cdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4772 ===============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4774 The CAR of a list is, quite simply, the first item in the list. Thus
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4775 the CAR of the list `(rose violet daisy buttercup)' is `rose'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4776
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4777 If you are reading this in Info in GNU Emacs, you can see this by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4778 evaluating the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4779
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4780 (car '(rose violet daisy buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4782 After evaluating the expression, `rose' will appear in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4783
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4784 Clearly, a more reasonable name for the `car' function would be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4785 `first' and this is often suggested.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4786
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4787 `car' does not remove the first item from the list; it only reports
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4788 what it is. After `car' has been applied to a list, the list is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4789 still the same as it was. In the jargon, `car' is `non-destructive'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4790 This feature turns out to be important.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4791
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4792 The CDR of a list is the rest of the list, that is, the `cdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4793 function returns the part of the list that follows the first item.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4794 Thus, while the CAR of the list `'(rose violet daisy buttercup)' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4795 `rose', the rest of the list, the value returned by the `cdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4796 function, is `(violet daisy buttercup)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4797
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4798 You can see this by evaluating the following in the usual way:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4799
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4800 (cdr '(rose violet daisy buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4801
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4802 When you evaluate this, `(violet daisy buttercup)' will appear in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4803 echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4804
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4805 Like `car', `cdr' does not remove any elements from the list--it just
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4806 returns a report of what the second and subsequent elements are.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4807
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4808 Incidentally, in the example, the list of flowers is quoted. If it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4809 were not, the Lisp interpreter would try to evaluate the list by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4810 calling `rose' as a function. In this example, we do not want to do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4811 that.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4812
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4813 Clearly, a more reasonable name for `cdr' would be `rest'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4814
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4815 (There is a lesson here: when you name new functions, consider very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4816 carefully what you are doing, since you may be stuck with the names
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4817 for far longer than you expect. The reason this document perpetuates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4818 these names is that the Emacs Lisp source code uses them, and if I did
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4819 not use them, you would have a hard time reading the code; but do,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4820 please, try to avoid using these terms yourself. The people who come
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4821 after you will be grateful to you.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4822
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4823 When `car' and `cdr' are applied to a list made up of symbols, such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4824 as the list `(pine fir oak maple)', the element of the list returned
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4825 by the function `car' is the symbol `pine' without any parentheses
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4826 around it. `pine' is the first element in the list. However, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4827 CDR of the list is a list itself, `(fir oak maple)', as you can see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4828 by evaluating the following expressions in the usual way:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4829
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4830 (car '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4831
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4832 (cdr '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4833
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4834 On the other hand, in a list of lists, the first element is itself a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4835 list. `car' returns this first element as a list. For example, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4836 following list contains three sub-lists, a list of carnivores, a list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4837 of herbivores and a list of sea mammals:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4838
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4839 (car '((lion tiger cheetah)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4840 (gazelle antelope zebra)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4841 (whale dolphin seal)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4842
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4843 In this example, the first element or CAR of the list is the list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4844 carnivores, `(lion tiger cheetah)', and the rest of the list is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4845 `((gazelle antelope zebra) (whale dolphin seal))'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4846
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4847 (cdr '((lion tiger cheetah)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4848 (gazelle antelope zebra)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4849 (whale dolphin seal)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4850
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4851 It is worth saying again that `car' and `cdr' are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4852 non-destructive--that is, they do not modify or change lists to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4853 they are applied. This is very important for how they are used.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4854
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4855 Also, in the first chapter, in the discussion about atoms, I said that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4856 in Lisp, "certain kinds of atom, such as an array, can be separated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4857 into parts; but the mechanism for doing this is different from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4858 mechanism for splitting a list. As far as Lisp is concerned, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4859 atoms of a list are unsplittable." (*Note Lisp Atoms::.) The `car'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4860 and `cdr' functions are used for splitting lists and are considered
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4861 fundamental to Lisp. Since they cannot split or gain access to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4862 parts of an array, an array is considered an atom. Conversely, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4863 other fundamental function, `cons', can put together or construct a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4864 list, but not an array. (Arrays are handled by array-specific
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4865 functions. *Note Arrays: (elisp)Arrays.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4866
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4867 `cons'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4868 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4869
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4870 The `cons' function constructs lists; it is the inverse of `car' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4871 `cdr'. For example, `cons' can be used to make a four element list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4872 from the three element list, `(fir oak maple)':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4873
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4874 (cons 'pine '(fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4875
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4876 After evaluating this list, you will see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4877
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4878 (pine fir oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4879
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4880 appear in the echo area. `cons' causes the creation of a new list in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4881 which the element is followed by the elements of the original list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4883 We often say that ``cons' puts a new element at the beginning of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4884 list; it attaches or pushes elements onto the list', but this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4885 phrasing can be misleading, since `cons' does not change an existing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4886 list, but creates a new one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4888 Like `car' and `cdr', `cons' is non-destructive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4889
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4890 Build a list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4891 ------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4892
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4893 `cons' must have a list to attach to.(1) You cannot start from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4894 absolutely nothing. If you are building a list, you need to provide
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4895 at least an empty list at the beginning. Here is a series of `cons'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4896 expressions that build up a list of flowers. If you are reading this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4897 in Info in GNU Emacs, you can evaluate each of the expressions in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4898 usual way; the value is printed in this text after `=>', which you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4899 may read as `evaluates to'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4900
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4901 (cons 'buttercup ())
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4902 => (buttercup)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4903
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4904 (cons 'daisy '(buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4905 => (daisy buttercup)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4906
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4907 (cons 'violet '(daisy buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4908 => (violet daisy buttercup)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4909
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4910 (cons 'rose '(violet daisy buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4911 => (rose violet daisy buttercup)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4912
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4913 In the first example, the empty list is shown as `()' and a list made
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4914 up of `buttercup' followed by the empty list is constructed. As you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4915 can see, the empty list is not shown in the list that was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4916 constructed. All that you see is `(buttercup)'. The empty list is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4917 not counted as an element of a list because there is nothing in an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4918 empty list. Generally speaking, an empty list is invisible.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4919
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4920 The second example, `(cons 'daisy '(buttercup))' constructs a new,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4921 two element list by putting `daisy' in front of `buttercup'; and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4922 third example constructs a three element list by putting `violet' in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4923 front of `daisy' and `buttercup'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4924
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4925 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4926
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4927 (1) Actually, you can `cons' an element to an atom to produce a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4928 dotted pair. Dotted pairs are not discussed here; see *Note Dotted
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4929 Pair Notation: (elisp)Dotted Pair Notation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4930
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4931 Find the Length of a List: `length'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4932 -----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4933
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4934 You can find out how many elements there are in a list by using the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4935 Lisp function `length', as in the following examples:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4936
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4937 (length '(buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4938 => 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4939
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4940 (length '(daisy buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4941 => 2
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4942
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4943 (length (cons 'violet '(daisy buttercup)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4944 => 3
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4945
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4946 In the third example, the `cons' function is used to construct a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4947 three element list which is then passed to the `length' function as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4948 its argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4949
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4950 We can also use `length' to count the number of elements in an empty
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4951 list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4952
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4953 (length ())
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4954 => 0
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4955
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4956 As you would expect, the number of elements in an empty list is zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4957
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4958 An interesting experiment is to find out what happens if you try to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4959 find the length of no list at all; that is, if you try to call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4960 `length' without giving it an argument, not even an empty list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4961
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4962 (length )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4963
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4964 What you see, if you evaluate this, is the error message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4965
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4966 Wrong number of arguments: #<subr length>, 0
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4967
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4968 This means that the function receives the wrong number of arguments,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4969 zero, when it expects some other number of arguments. In this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4970 one argument is expected, the argument being a list whose length the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4971 function is measuring. (Note that _one_ list is _one_ argument, even
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4972 if the list has many elements inside it.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4973
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4974 The part of the error message that says `#<subr length>' is the name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4975 of the function. This is written with a special notation, `#<subr',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4976 that indicates that the function `length' is one of the primitive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4977 functions written in C rather than in Emacs Lisp. (`subr' is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4978 abbreviation for `subroutine'.) *Note What Is a Function?:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4979 (elisp)What Is a Function, for more about subroutines.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4980
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4981 `nthcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4982 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4983
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4984 The `nthcdr' function is associated with the `cdr' function. What it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4985 does is take the CDR of a list repeatedly.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4986
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4987 If you take the CDR of the list `(pine fir oak maple)', you will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4988 returned the list `(fir oak maple)'. If you repeat this on what was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4989 returned, you will be returned the list `(oak maple)'. (Of course,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4990 repeated CDRing on the original list will just give you the original
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4991 CDR since the function does not change the list. You need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4992 evaluate the CDR of the CDR and so on.) If you continue this,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4993 eventually you will be returned an empty list, which in this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4994 instead of being shown as `()' is shown as `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4995
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4996 For review, here is a series of repeated CDRs, the text following the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4997 `=>' shows what is returned.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4998
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
4999 (cdr '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5000 =>(fir oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5001
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5002 (cdr '(fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5003 => (oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5004
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5005 (cdr '(oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5006 =>(maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5007
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5008 (cdr '(maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5009 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5010
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5011 (cdr 'nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5012 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5013
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5014 (cdr ())
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5015 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5016
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5017 You can also do several CDRs without printing the values in between,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5018 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5019
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5020 (cdr (cdr '(pine fir oak maple)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5021 => (oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5022
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5023 In this example, the Lisp interpreter evaluates the innermost list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5024 first. The innermost list is quoted, so it just passes the list as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5025 it is to the innermost `cdr'. This `cdr' passes a list made up of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5026 second and subsequent elements of the list to the outermost `cdr',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5027 which produces a list composed of the third and subsequent elements of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5028 the original list. In this example, the `cdr' function is repeated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5029 and returns a list that consists of the original list without its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5030 first two elements.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5031
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5032 The `nthcdr' function does the same as repeating the call to `cdr'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5033 In the following example, the argument 2 is passed to the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5034 `nthcdr', along with the list, and the value returned is the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5035 without its first two items, which is exactly the same as repeating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5036 `cdr' twice on the list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5037
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5038 (nthcdr 2 '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5039 => (oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5040
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5041 Using the original four element list, we can see what happens when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5042 various numeric arguments are passed to `nthcdr', including 0, 1, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5043 5:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5044
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5045 ;; Leave the list as it was.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5046 (nthcdr 0 '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5047 => (pine fir oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5048
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5049 ;; Return a copy without the first element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5050 (nthcdr 1 '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5051 => (fir oak maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5052
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5053 ;; Return a copy of the list without three elements.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5054 (nthcdr 3 '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5055 => (maple)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5056
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5057 ;; Return a copy lacking all four elements.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5058 (nthcdr 4 '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5059 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5060
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5061 ;; Return a copy lacking all elements.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5062 (nthcdr 5 '(pine fir oak maple))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5063 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5064
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5065 `nth'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5066 =====
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5067
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5068 The `nthcdr' function takes the CDR of a list repeatedly. The `nth'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5069 function takes the CAR of the result returned by `nthcdr'. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5070 returns the Nth element of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5072 Thus, if it were not defined in C for speed, the definition of `nth'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5073 would be:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5074
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5075 (defun nth (n list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5076 "Returns the Nth element of LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5077 N counts from zero. If LIST is not that long, nil is returned."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5078 (car (nthcdr n list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5079
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5080 (Originally, `nth' was defined in Emacs Lisp in `subr.el', but its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5081 definition was redone in C in the 1980s.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5082
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5083 The `nth' function returns a single element of a list. This can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5084 very convenient.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5085
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5086 Note that the elements are numbered from zero, not one. That is to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5087 say, the first element of a list, its CAR is the zeroth element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5088 This is called `zero-based' counting and often bothers people who are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5089 accustomed to the first element in a list being number one, which is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5090 `one-based'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5091
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5092 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5093
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5094 (nth 0 '("one" "two" "three"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5095 => "one"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5096
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5097 (nth 1 '("one" "two" "three"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5098 => "two"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5099
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5100 It is worth mentioning that `nth', like `nthcdr' and `cdr', does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5101 change the original list--the function is non-destructive. This is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5102 in sharp contrast to the `setcar' and `setcdr' functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5103
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5104 `setcar'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5105 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5106
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5107 As you might guess from their names, the `setcar' and `setcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5108 functions set the CAR or the CDR of a list to a new value. They
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5109 actually change the original list, unlike `car' and `cdr' which leave
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5110 the original list as it was. One way to find out how this works is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5111 to experiment. We will start with the `setcar' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5112
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5113 First, we can make a list and then set the value of a variable to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5114 list, using the `setq' function. Here is a list of animals:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5115
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5116 (setq animals '(antelope giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5117
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5118 If you are reading this in Info inside of GNU Emacs, you can evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5119 this expression in the usual fashion, by positioning the cursor after
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5120 the expression and typing `C-x C-e'. (I'm doing this right here as I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5121 write this. This is one of the advantages of having the interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5122 built into the computing environment.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5123
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5124 When we evaluate the variable `animals', we see that it is bound to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5125 the list `(antelope giraffe lion tiger)':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5126
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5127 animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5128 => (antelope giraffe lion tiger)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5129
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5130 Put another way, the variable `animals' points to the list `(antelope
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5131 giraffe lion tiger)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5133 Next, evaluate the function `setcar' while passing it two arguments,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5134 the variable `animals' and the quoted symbol `hippopotamus'; this is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5135 done by writing the three element list `(setcar animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5136 'hippopotamus)' and then evaluating it in the usual fashion:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5137
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5138 (setcar animals 'hippopotamus)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5139
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5140 After evaluating this expression, evaluate the variable `animals'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5141 again. You will see that the list of animals has changed:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5142
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5143 animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5144 => (hippopotamus giraffe lion tiger)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5145
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5146 The first element on the list, `antelope' is replaced by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5147 `hippopotamus'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5148
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5149 So we can see that `setcar' did not add a new element to the list as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5150 `cons' would have; it replaced `giraffe' with `hippopotamus'; it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5151 _changed_ the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5152
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5153 `setcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5154 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5155
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5156 The `setcdr' function is similar to the `setcar' function, except
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5157 that the function replaces the second and subsequent elements of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5158 list rather than the first element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5159
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5160 To see how this works, set the value of the variable to a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5161 domesticated animals by evaluating the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5162
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5163 (setq domesticated-animals '(horse cow sheep goat))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5164
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5165 If you now evaluate the list, you will be returned the list `(horse
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5166 cow sheep goat)':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5167
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5168 domesticated-animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5169 => (horse cow sheep goat)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5170
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5171 Next, evaluate `setcdr' with two arguments, the name of the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5172 which has a list as its value, and the list to which the CDR of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5173 first list will be set;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5174
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5175 (setcdr domesticated-animals '(cat dog))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5176
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5177 If you evaluate this expression, the list `(cat dog)' will appear in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5178 the echo area. This is the value returned by the function. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5179 result we are interested in is the "side effect", which we can see by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5180 evaluating the variable `domesticated-animals':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5181
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5182 domesticated-animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5183 => (horse cat dog)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5184
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5185 Indeed, the list is changed from `(horse cow sheep goat)' to `(horse
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5186 cat dog)'. The CDR of the list is changed from `(cow sheep goat)' to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5187 `(cat dog)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5188
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5189 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5190 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5191
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5192 Construct a list of four birds by evaluating several expressions with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5193 `cons'. Find out what happens when you `cons' a list onto itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5194 Replace the first element of the list of four birds with a fish.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5195 Replace the rest of that list with a list of other fish.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5197 Cutting and Storing Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5198 ************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5199
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5200 Whenever you cut or clip text out of a buffer with a `kill' command in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5201 GNU Emacs, it is stored in a list and you can bring it back with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5202 `yank' command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5203
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5204 (The use of the word `kill' in Emacs for processes which specifically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5205 _do not_ destroy the values of the entities is an unfortunate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5206 historical accident. A much more appropriate word would be `clip'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5207 since that is what the kill commands do; they clip text out of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5208 buffer and put it into storage from which it can be brought back. I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5209 have often been tempted to replace globally all occurrences of `kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5210 in the Emacs sources with `clip' and all occurrences of `killed' with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5211 `clipped'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5213 Storing Text in a List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5214 ======================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5215
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5216 When text is cut out of a buffer, it is stored on a list. Successive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5217 pieces of text are stored on the list successively, so the list might
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5218 look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5219
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5220 ("a piece of text" "previous piece")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5221
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5222 The function `cons' can be used to to create a new list from a piece
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5223 of text (an `atom', to use the jargon) and an existing list, like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5224 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5226 (cons "another piece"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5227 '("a piece of text" "previous piece"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5228
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5229 If you evaluate this expression, a list of three elements will appear
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5230 in the echo area:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5231
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5232 ("another piece" "a piece of text" "previous piece")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5233
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5234 With the `car' and `nthcdr' functions, you can retrieve whichever
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5235 piece of text you want. For example, in the following code, `nthcdr
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5236 1 ...' returns the list with the first item removed; and the `car'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5237 returns the first element of that remainder--the second element of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5238 the original list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5239
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5240 (car (nthcdr 1 '("another piece"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5241 "a piece of text"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5242 "previous piece")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5243 => "a piece of text"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5244
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5245 The actual functions in Emacs are more complex than this, of course.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5246 The code for cutting and retrieving text has to be written so that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5247 Emacs can figure out which element in the list you want--the first,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5248 second, third, or whatever. In addition, when you get to the end of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5249 the list, Emacs should give you the first element of the list, rather
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5250 than nothing at all.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5251
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5252 The list that holds the pieces of text is called the "kill ring".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5253 This chapter leads up to a description of the kill ring and how it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5254 used by first tracing how the `zap-to-char' function works. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5255 function uses (or `calls') a function that invokes a function that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5256 manipulates the kill ring. Thus, before reaching the mountains, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5257 climb the foothills.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5258
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5259 A subsequent chapter describes how text that is cut from the buffer is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5260 retrieved. *Note Yanking Text Back: Yanking.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5261
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5262 `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5263 =============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5264
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5265 The `zap-to-char' function barely changed between GNU Emacs version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5266 19 and GNU Emacs version 21. However, `zap-to-char' calls another
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5267 function, `kill-region', which enjoyed a major rewrite on the way to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5268 version 21.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5269
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5270 The `kill-region' function in Emacs 19 is complex, but does not use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5271 code that is important at this time. We will skip it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5272
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5273 The `kill-region' function in Emacs 21 is easier to read than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5274 same function in Emacs 19 and introduces a very important concept,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5275 that of error handling. We will walk through the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5276
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5277 But first, let us look at the interactive `zap-to-char' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5278
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5279 The Complete `zap-to-char' Implementation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5280 -----------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5281
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5282 The GNU Emacs version 19 and version 21 implementations of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5283 `zap-to-char' function are nearly identical in form, and they work
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5284 alike. The function removes the text in the region between the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5285 location of the cursor (i.e., of point) up to and including the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5286 occurrence of a specified character. The text that `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5287 removes is put in the kill ring; and it can be retrieved from the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5288 ring by typing `C-y' (`yank'). If the command is given an argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5289 it removes text through that number of occurrences. Thus, if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5290 cursor were at the beginning of this sentence and the character were
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5291 `s', `Thus' would be removed. If the argument were two, `Thus, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5292 the curs' would be removed, up to and including the `s' in `cursor'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5293
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5294 If the specified character is not found, `zap-to-char' will say
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5295 "Search failed", tell you the character you typed, and not remove any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5296 text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5297
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5298 In order to determine how much text to remove, `zap-to-char' uses a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5299 search function. Searches are used extensively in code that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5300 manipulates text, and we will focus attention on them as well as on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5301 the deletion command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5302
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5303 Here is the complete text of the version 19 implementation of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5304 function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5305
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5306 (defun zap-to-char (arg char) ; version 19 implementation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5307 "Kill up to and including ARG'th occurrence of CHAR.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5308 Goes backward if ARG is negative; error if CHAR not found."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5309 (interactive "*p\ncZap to char: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5310 (kill-region (point)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5311 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5312 (search-forward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5313 (char-to-string char) nil nil arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5314 (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5315
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5316 The `interactive' Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5317 ----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5318
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5319 The interactive expression in the `zap-to-char' command looks like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5320 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5321
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5322 (interactive "*p\ncZap to char: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5323
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5324 The part within quotation marks, `"*p\ncZap to char: "', specifies
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5325 three different things. First, and most simply, the asterisk, `*',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5326 causes an error to be signalled if the buffer is read-only. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5327 means that if you try `zap-to-char' in a read-only buffer you will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5328 not be able to remove text, and you will receive a message that says
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5329 "Buffer is read-only"; your terminal may beep at you as well.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5331 The version 21 implementation does not have the asterisk, `*'. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5332 function works the same as in version 19: in both cases, it cannot
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5333 remove text from a read-only buffer but the function does copy the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5334 text that would have been removed to the kill ring. Also, in both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5335 cases, you see an error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5336
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5337 However, the version 19 implementation copies text from a read-only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5338 buffer only because of a mistake in the implementation of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5339 `interactive'. According to the documentation for `interactive', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5340 asterisk, `*', should prevent the `zap-to-char' function from doing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5341 anything at all when the buffer is read only. The function should
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5342 not copy the text to the kill ring. It is a bug that it does.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5343
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5344 In version 21, `interactive' is implemented correctly. So the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5345 asterisk, `*', had to be removed from the interactive specification.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5346 If you insert an `*' and evaluate the function definition, then the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5347 next time you run the `zap-to-char' function on a read-only buffer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5348 you will not copy any text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5349
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5350 That change aside, and a change to the documentation, the two versions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5351 of the `zap-to-char' function are identical.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5352
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5353 Let us continue with the interactive specification.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5354
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5355 The second part of `"*p\ncZap to char: "' is the `p'. This part is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5356 separated from the next part by a newline, `\n'. The `p' means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5357 the first argument to the function will be passed the value of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5358 `processed prefix'. The prefix argument is passed by typing `C-u'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5359 and a number, or `M-' and a number. If the function is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5360 interactively without a prefix, 1 is passed to this argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5361
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5362 The third part of `"*p\ncZap to char: "' is `cZap to char: '. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5363 this part, the lower case `c' indicates that `interactive' expects a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5364 prompt and that the argument will be a character. The prompt follows
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5365 the `c' and is the string `Zap to char: ' (with a space after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5366 colon to make it look good).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5367
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5368 What all this does is prepare the arguments to `zap-to-char' so they
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5369 are of the right type, and give the user a prompt.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5370
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5371 The Body of `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5372 -------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5373
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5374 The body of the `zap-to-char' function contains the code that kills
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5375 (that is, removes) the text in the region from the current position
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5376 of the cursor up to and including the specified character. The first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5377 part of the code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5378
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5379 (kill-region (point) ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5380
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5381 `(point)' is the current position of the cursor.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5382
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5383 The next part of the code is an expression using `progn'. The body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5384 of the `progn' consists of calls to `search-forward' and `point'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5385
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5386 It is easier to understand how `progn' works after learning about
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5387 `search-forward', so we will look at `search-forward' and then at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5388 `progn'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5389
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5390 The `search-forward' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5391 -----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5392
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5393 The `search-forward' function is used to locate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5394 zapped-for-character in `zap-to-char'. If the search is successful,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5395 `search-forward' leaves point immediately after the last character in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5396 the target string. (In `zap-to-char', the target string is just one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5397 character long.) If the search is backwards, `search-forward' leaves
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5398 point just before the first character in the target. Also,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5399 `search-forward' returns `t' for true. (Moving point is therefore a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5400 `side effect'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5401
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5402 In `zap-to-char', the `search-forward' function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5403
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5404 (search-forward (char-to-string char) nil nil arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5405
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5406 The `search-forward' function takes four arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5407
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5408 1. The first argument is the target, what is searched for. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5409 must be a string, such as `"z"'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5410
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5411 As it happens, the argument passed to `zap-to-char' is a single
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5412 character. Because of the way computers are built, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5413 interpreter may treat a single character as being different from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5414 a string of characters. Inside the computer, a single character
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5415 has a different electronic format than a string of one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5416 character. (A single character can often be recorded in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5417 computer using exactly one byte; but a string may be longer, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5418 the computer needs to be ready for this.) Since the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5419 `search-forward' function searches for a string, the character
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5420 that the `zap-to-char' function receives as its argument must be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5421 converted inside the computer from one format to the other;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5422 otherwise the `search-forward' function will fail. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5423 `char-to-string' function is used to make this conversion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5424
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5425 2. The second argument bounds the search; it is specified as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5426 position in the buffer. In this case, the search can go to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5427 end of the buffer, so no bound is set and the second argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5428 `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5429
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5430 3. The third argument tells the function what it should do if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5431 search fails--it can signal an error (and print a message) or it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5432 can return `nil'. A `nil' as the third argument causes the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5433 function to signal an error when the search fails.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5434
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5435 4. The fourth argument to `search-forward' is the repeat count--how
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5436 many occurrences of the string to look for. This argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5437 optional and if the function is called without a repeat count,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5438 this argument is passed the value 1. If this argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5439 negative, the search goes backwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5440
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5441 In template form, a `search-forward' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5442
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5443 (search-forward "TARGET-STRING"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5444 LIMIT-OF-SEARCH
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5445 WHAT-TO-DO-IF-SEARCH-FAILS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5446 REPEAT-COUNT)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5447
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5448 We will look at `progn' next.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5449
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5450 The `progn' Special Form
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5451 ------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5452
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5453 `progn' is a special form that causes each of its arguments to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5454 evaluated in sequence and then returns the value of the last one. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5455 preceding expressions are evaluated only for the side effects they
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5456 perform. The values produced by them are discarded.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5457
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5458 The template for a `progn' expression is very simple:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5459
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5460 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5461 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5462
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5463 In `zap-to-char', the `progn' expression has to do two things: put
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5464 point in exactly the right position; and return the location of point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5465 so that `kill-region' will know how far to kill to.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5466
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5467 The first argument to the `progn' is `search-forward'. When
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5468 `search-forward' finds the string, the function leaves point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5469 immediately after the last character in the target string. (In this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5470 case the target string is just one character long.) If the search is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5471 backwards, `search-forward' leaves point just before the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5472 character in the target. The movement of point is a side effect.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5473
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5474 The second and last argument to `progn' is the expression `(point)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5475 This expression returns the value of point, which in this case will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5476 be the location to which it has been moved by `search-forward'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5477 value is returned by the `progn' expression and is passed to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5478 `kill-region' as `kill-region''s second argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5479
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5480 Summing up `zap-to-char'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5481 ------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5482
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5483 Now that we have seen how `search-forward' and `progn' work, we can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5484 see how the `zap-to-char' function works as a whole.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5485
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5486 The first argument to `kill-region' is the position of the cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5487 when the `zap-to-char' command is given--the value of point at that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5488 time. Within the `progn', the search function then moves point to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5489 just after the zapped-to-character and `point' returns the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5490 this location. The `kill-region' function puts together these two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5491 values of point, the first one as the beginning of the region and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5492 second one as the end of the region, and removes the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5494 The `progn' special form is necessary because the `kill-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5495 command takes two arguments; and it would fail if `search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5496 and `point' expressions were written in sequence as two additional
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5497 arguments. The `progn' expression is a single argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5498 `kill-region' and returns the one value that `kill-region' needs for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5499 its second argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5500
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5501 `kill-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5502 =============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5504 The `zap-to-char' function uses the `kill-region' function. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5505 function clips text from a region and copies that text to the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5506 ring, from which it may be retrieved.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5507
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5508 The Emacs 21 version of that function uses `condition-case' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5509 `copy-region-as-kill', both of which we will explain.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5510 `condition-case' is an important special form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5511
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5512 In essence, the `kill-region' function calls `condition-case', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5513 takes three arguments. In this function, the first argument does
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5514 nothing. The second argument contains the code that does the work
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5515 when all goes well. The third argument contains the code that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5516 called in the event of an error.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5517
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5518 The Complete `kill-region' Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5519 -------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5520
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5521 We will go through the `condition-case' code in a moment. First, let
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5522 us look at the complete definition of `kill-region', with comments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5523 added:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5524
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5525 (defun kill-region (beg end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5526 "Kill between point and mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5527 The text is deleted but saved in the kill ring."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5528 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5529
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5530 ;; 1. `condition-case' takes three arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5531 ;; If the first argument is nil, as it is here,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5532 ;; information about the error signal is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5533 ;; stored for use by another function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5534 (condition-case nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5535
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5536 ;; 2. The second argument to `condition-case'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5537 ;; tells the Lisp interpreter what to do when all goes well.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5538
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5539 ;; The `delete-and-extract-region' function usually does the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5540 ;; work. If the beginning and ending of the region are both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5541 ;; the same, then the variable `string' will be empty, or nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5542 (let ((string (delete-and-extract-region beg end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5544 ;; `when' is an `if' clause that cannot take an `else-part'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5545 ;; Emacs normally sets the value of `last-command' to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5546 ;; previous command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5547 ;; `kill-append' concatenates the new string and the old.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5548 ;; `kill-new' inserts text into a new item in the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5549 (when string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5550 (if (eq last-command 'kill-region)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5551 ;; if true, prepend string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5552 (kill-append string (< end beg))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5553 (kill-new string)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5554 (setq this-command 'kill-region))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5555
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5556 ;; 3. The third argument to `condition-case' tells the interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5557 ;; what to do with an error.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5558 ;; The third argument has a conditions part and a body part.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5559 ;; If the conditions are met (in this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5560 ;; if text or buffer is read-only)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5561 ;; then the body is executed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5562 ((buffer-read-only text-read-only) ;; this is the if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5563 ;; then...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5564 (copy-region-as-kill beg end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5565 (if kill-read-only-ok ;; usually this variable is nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5566 (message "Read only text copied to kill ring")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5567 ;; or else, signal an error if the buffer is read-only;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5568 (barf-if-buffer-read-only)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5569 ;; and, in any case, signal that the text is read-only.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5570 (signal 'text-read-only (list (current-buffer)))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5571
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5572 `condition-case'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5573 ----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5574
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5575 As we have seen earlier (*note Generate an Error Message: Making
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5576 Errors.), when the Emacs Lisp interpreter has trouble evaluating an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5577 expression, it provides you with help; in the jargon, this is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5578 "signaling an error". Usually, the computer stops the program and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5579 shows you a message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5580
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5581 However, some programs undertake complicated actions. They should not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5582 simply stop on an error. In the `kill-region' function, the most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5583 likely error is that you will try to kill text that is read-only and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5584 cannot be removed. So the `kill-region' function contains code to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5585 handle this circumstance. This code, which makes up the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5586 `kill-region' function, is inside of a `condition-case' special form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5587
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5588 The template for `condition-case' looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5589
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5590 (condition-case
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5591 VAR
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5592 BODYFORM
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5593 ERROR-HANDLER...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5594
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5595 The second argument, BODYFORM, is straightforward. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5596 `condition-case' special form causes the Lisp interpreter to evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5597 the code in BODYFORM. If no error occurs, the special form returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5598 the code's value and produces the side-effects, if any.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5599
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5600 In short, the BODYFORM part of a `condition-case' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5601 determines what should happen when everything works correctly.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5602
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5603 However, if an error occurs, among its other actions, the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5604 generating the error signal will define one or more error condition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5605 names.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5606
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5607 An error handler is the third argument to `condition case'. An error
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5608 handler has two parts, a CONDITION-NAME and a BODY. If the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5609 CONDITION-NAME part of an error handler matches a condition name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5610 generated by an error, then the BODY part of the error handler is run.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5611
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5612 As you will expect, the CONDITION-NAME part of an error handler may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5613 be either a single condition name or a list of condition names.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5614
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5615 Also, a complete `condition-case' expression may contain more than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5616 one error handler. When an error occurs, the first applicable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5617 handler is run.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5618
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5619 Lastly, the first argument to the `condition-case' expression, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5620 VAR argument, is sometimes bound to a variable that contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5621 information about the error. However, if that argument is nil, as is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5622 the case in `kill-region', that information is discarded.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5623
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5624 In brief, in the `kill-region' function, the code `condition-case'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5625 works like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5626
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5627 IF NO ERRORS, RUN ONLY THIS CODE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5628 BUT, IF ERRORS, RUN THIS OTHER CODE.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5629
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5630 `delete-and-extract-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5631 ---------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5632
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5633 A `condition-case' expression has two parts, a part that is evaluated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5634 in the expectation that all will go well, but which may generate an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5635 error; and a part that is evaluated when there is an error.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5636
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5637 First, let us look at the code in `kill-region' that is run in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5638 expectation that all goes well. This is the core of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5639 The code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5640
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5641 (let ((string (delete-and-extract-region beg end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5642 (when string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5643 (if (eq last-command 'kill-region)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5644 (kill-append string (< end beg))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5645 (kill-new string)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5646 (setq this-command 'kill-region))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5647
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5648 It looks complicated because we have the new functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5649 `delete-and-extract-region', `kill-append', and `kill-new' as well as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5650 the new variables, `last-command' and `this-command'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5651
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5652 The `delete-and-extract-region' function is straightforward. It is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5653 built-in function that deletes the text in a region (a side effect)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5654 and also returns that text. This is the function that actually
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5655 removes the text. (And if it cannot do that, it signals the error.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5656
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5657 In this `let' expression, the text that `delete-and-extract-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5658 returns is placed in the local variable called `string'. This is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5659 text that is removed from the buffer. (To be more precise, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5660 variable is set to point to the address of the extracted text; to say
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5661 it is `placed in' the variable is simply a shorthand.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5662
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5663 If the variable `string' does point to text, that text is added to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5664 the kill ring. The variable will have a `nil' value if no text was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5665 removed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5666
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5667 The code uses `when' to determine whether the variable `string'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5668 points to text. A `when' statement is simply a programmers'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5669 convenience. A `when' statement is an `if' statement without the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5670 possibility of an else clause. In your mind, you can replace `when'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5671 with `if' and understand what goes on. That is what the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5672 interpreter does.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5673
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5674 Technically speaking, `when' is a Lisp macro. A Lisp "macro" enables
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5675 you to define new control constructs and other language features. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5676 tells the interpreter how to compute another Lisp expression which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5677 will in turn compute the value. In this case, the `other expression'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5678 is an `if' expression. For more about Lisp macros, see *Note Macros:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5679 (elisp)Macros. The C programming language also provides macros.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5680 These are different, but also useful. We will briefly look at C
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5681 macros in *Note Digression into C::.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5682
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5683 If the string has content, then another conditional expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5684 executed. This is an `if' with both a then-part and an else-part.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5685
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5686 (if (eq last-command 'kill-region)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5687 (kill-append string (< end beg))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5688 (kill-new string)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5689
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5690 The then-part is evaluated if the previous command was another call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5691 `kill-region'; if not, the else-part is evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5692
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5693 `last-command' is a variable that comes with Emacs that we have not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5694 seen before. Normally, whenever a function is executed, Emacs sets
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5695 the value of `last-command' to the previous command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5696
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5697 In this segment of the definition, the `if' expression checks whether
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5698 the previous command was `kill-region'. If it was,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5699
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5700 (kill-append string (< end beg))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5701
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5702 concatenates a copy of the newly clipped text to the just previously
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5703 clipped text in the kill ring. (If the `(< end beg))' expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5704 true, `kill-append' prepends the string to the just previously
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5705 clipped text. For a detailed discussion, see *Note The `kill-append'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5706 function: kill-append function.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5707
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5708 If you then yank back the text, i.e., `paste' it, you get both pieces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5709 of text at once. That way, if you delete two words in a row, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5710 then yank them back, you get both words, in their proper order, with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5711 one yank. (The `(< end beg))' expression makes sure the order is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5712 correct.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5713
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5714 On the other hand, if the previous command is not `kill-region', then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5715 the `kill-new' function is called, which adds the text to the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5716 ring as the latest item, and sets the `kill-ring-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5717 variable to point to it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5718
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5719 Digression into C
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5720 =================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5721
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5722 The `zap-to-char' command uses the `delete-and-extract-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5723 function, which in turn uses two other functions,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5724 `copy-region-as-kill' and `del_range_1'. The `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5725 function will be described in a following section; it puts a copy of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5726 the region in the kill ring so it can be yanked back. (*Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5727 `copy-region-as-kill': copy-region-as-kill.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5728
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5729 The `delete-and-extract-region' function removes the contents of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5730 region and you cannot get them back.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5731
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5732 Unlike the other code discussed here, `delete-and-extract-region' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5733 not written in Emacs Lisp; it is written in C and is one of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5734 primitives of the GNU Emacs system. Since it is very simple, I will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5735 digress briefly from Lisp and describe it here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5736
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5737 Like many of the other Emacs primitives, `delete-and-extract-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5738 is written as an instance of a C macro, a macro being a template for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5739 code. The complete macro looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5741 DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5742 Sdelete_and_extract_region, 2, 2, 0,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5743 "Delete the text between START and END and return it.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5744 (start, end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5745 Lisp_Object start, end;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5746 {
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5747 validate_region (&start, &end);
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5748 return del_range_1 (XINT (start), XINT (end), 1, 1);
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5749 }
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5750
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5751 Without going into the details of the macro writing process, let me
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5752 point out that this macro starts with the word `DEFUN'. The word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5753 `DEFUN' was chosen since the code serves the same purpose as `defun'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5754 does in Lisp. The word `DEFUN' is followed by seven parts inside of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5755 parentheses:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5756
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5757 * The first part is the name given to the function in Lisp,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5758 `delete-and-extract-region'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5759
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5760 * The second part is the name of the function in C,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5761 `Fdelete_and_extract_region'. By convention, it starts with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5762 `F'. Since C does not use hyphens in names, underscores are used
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5763 instead.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5764
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5765 * The third part is the name for the C constant structure that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5766 records information on this function for internal use. It is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5767 the name of the function in C but begins with an `S' instead of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5768 an `F'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5769
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5770 * The fourth and fifth parts specify the minimum and maximum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5771 number of arguments the function can have. This function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5772 demands exactly 2 arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5774 * The sixth part is nearly like the argument that follows the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5775 `interactive' declaration in a function written in Lisp: a letter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5776 followed, perhaps, by a prompt. The only difference from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5777 Lisp is when the macro is called with no arguments. Then you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5778 write a `0' (which is a `null string'), as in this macro.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5779
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5780 If you were to specify arguments, you would place them between
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5781 quotation marks. The C macro for `goto-char' includes `"NGoto
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5782 char: "' in this position to indicate that the function expects
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5783 a raw prefix, in this case, a numerical location in a buffer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5784 and provides a prompt.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5785
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5786 * The seventh part is a documentation string, just like the one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5787 for a function written in Emacs Lisp, except that every newline
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5788 must be written explicitly as `\n' followed by a backslash and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5789 carriage return.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5790
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5791 Thus, the first two lines of documentation for `goto-char' are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5792 written like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5794 "Set point to POSITION, a number or marker.\n\
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5795 Beginning of buffer is position (point-min), end is (point-max).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5797 In a C macro, the formal parameters come next, with a statement of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5798 what kind of object they are, followed by what might be called the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5799 `body' of the macro. For `delete-and-extract-region' the `body'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5800 consists of the following two lines:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5801
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5802 validate_region (&start, &end);
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5803 return del_range_1 (XINT (start), XINT (end), 1, 1);
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5804
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5805 The first function, `validate_region' checks whether the values
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5806 passed as the beginning and end of the region are the proper type and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5807 are within range. The second function, `del_range_1', actually
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5808 deletes the text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5809
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5810 `del_range_1' is a complex function we will not look into. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5811 updates the buffer and does other things.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5812
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5813 However, it is worth looking at the two arguments passed to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5814 `del_range'. These are `XINT (start)' and `XINT (end)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5816 As far as the C language is concerned, `start' and `end' are two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5817 integers that mark the beginning and end of the region to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5818 deleted(1).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5819
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5820 In early versions of Emacs, these two numbers were thirty-two bits
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5821 long, but the code is slowly being generalized to handle other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5822 lengths. Three of the available bits are used to specify the type of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5823 information and a fourth bit is used for handling the computer's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5824 memory; the remaining bits are used as `content'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5825
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5826 `XINT' is a C macro that extracts the relevant number from the longer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5827 collection of bits; the four other bits are discarded.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5828
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5829 The command in `delete-and-extract-region' looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5830
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5831 del_range_1 (XINT (start), XINT (end), 1, 1);
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5832
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5833 It deletes the region between the beginning position, `start', and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5834 the ending position, `end'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5835
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5836 From the point of view of the person writing Lisp, Emacs is all very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5837 simple; but hidden underneath is a great deal of complexity to make it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5838 all work.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5839
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5840 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5841
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5842 (1) More precisely, and requiring more expert knowledge to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5843 understand, the two integers are of type `Lisp_Object', which can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5844 also be a C union instead of an integer type.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5845
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5846 Initializing a Variable with `defvar'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5847 =====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5848
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5849 Unlike the `delete-and-extract-region' function, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5850 `copy-region-as-kill' function is written in Emacs Lisp. Two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5851 functions within it, `kill-append' and `kill-new', copy a region in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5852 buffer and save it in a variable called the `kill-ring'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5853 section describes how the `kill-ring' variable is created and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5854 initialized using the `defvar' special form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5855
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5856 (Again we note that the term `kill-ring' is a misnomer. The text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5857 that is clipped out of the buffer can be brought back; it is not a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5858 ring of corpses, but a ring of resurrectable text.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5859
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5860 In Emacs Lisp, a variable such as the `kill-ring' is created and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5861 given an initial value by using the `defvar' special form. The name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5862 comes from "define variable".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5863
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5864 The `defvar' special form is similar to `setq' in that it sets the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5865 value of a variable. It is unlike `setq' in two ways: first, it only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5866 sets the value of the variable if the variable does not already have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5867 a value. If the variable already has a value, `defvar' does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5868 override the existing value. Second, `defvar' has a documentation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5869 string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5870
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5871 (Another special form, `defcustom', is designed for variables that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5872 people customize. It has more features than `defvar'. (*Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5873 Setting Variables with `defcustom': defcustom.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5874
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5875 Seeing the Current Value of a Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5876 --------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5877
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5878 You can see the current value of a variable, any variable, by using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5879 the `describe-variable' function, which is usually invoked by typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5880 `C-h v'. If you type `C-h v' and then `kill-ring' (followed by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5881 <RET>) when prompted, you will see what is in your current kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5882 ring--this may be quite a lot! Conversely, if you have been doing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5883 nothing this Emacs session except read this document, you may have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5884 nothing in it. Also, you will see the documentation for `kill-ring':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5885
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5886 Documentation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5887 List of killed text sequences.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5888 Since the kill ring is supposed to interact nicely with cut-and-paste
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5889 facilities offered by window systems, use of this variable should
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5890 interact nicely with `interprogram-cut-function' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5891 `interprogram-paste-function'. The functions `kill-new',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5892 `kill-append', and `current-kill' are supposed to implement this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5893 interaction; you may want to use them instead of manipulating the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5894 ring directly.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5895
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5896 The kill ring is defined by a `defvar' in the following way:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5897
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5898 (defvar kill-ring nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5899 "List of killed text sequences.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5900 ...")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5901
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5902 In this variable definition, the variable is given an initial value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5903 `nil', which makes sense, since if you have saved nothing, you want
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5904 nothing back if you give a `yank' command. The documentation string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5905 is written just like the documentation string of a `defun'. As with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5906 the documentation string of the `defun', the first line of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5907 documentation should be a complete sentence, since some commands,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5908 like `apropos', print only the first line of documentation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5909 Succeeding lines should not be indented; otherwise they look odd when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5910 you use `C-h v' (`describe-variable').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5911
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5912 `defvar' and an asterisk
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5913 ------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5914
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5915 In the past, Emacs used the `defvar' special form both for internal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5916 variables that you would not expect a user to change and for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5917 variables that you do expect a user to change. Although you can still
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5918 use `defvar' for user customizable variables, please use `defcustom'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5919 instead, since that special form provides a path into the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5920 Customization commands. (*Note Setting Variables with `defcustom':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5921 defcustom.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5922
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5923 When you specified a variable using the `defvar' special form, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5924 could distinguish a readily settable variable from others by typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5925 an asterisk, `*', in the first column of its documentation string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5926 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5928 (defvar shell-command-default-error-buffer nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5929 "*Buffer name for `shell-command' ... error output.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5930 ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5931
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5932 This means that you could (and still can) use the `edit-options'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5933 command to change the value of `shell-command-default-error-buffer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5934 temporarily.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5935
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5936 However, options set using `edit-options' are set only for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5937 duration of your editing session. The new values are not saved
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5938 between sessions. Each time Emacs starts, it reads the original
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5939 value, unless you change the value within your `.emacs' file, either
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5940 by setting it manually or by using `customize'. *Note Your `.emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5941 File: Emacs Initialization.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5942
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5943 For me, the major use of the `edit-options' command is to suggest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5944 variables that I might want to set in my `.emacs' file. I urge you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5945 to look through the list. (*Note Editing Variable Values:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5946 (emacs)Edit Options.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5947
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5948 `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5949 =====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5950
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5951 The `copy-region-as-kill' function copies a region of text from a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5952 buffer and (via either `kill-append' or `kill-new') saves it in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5953 `kill-ring'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5954
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5955 If you call `copy-region-as-kill' immediately after a `kill-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5956 command, Emacs appends the newly copied text to the previously copied
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5957 text. This means that if you yank back the text, you get it all,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5958 from both this and the previous operation. On the other hand, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5959 some other command precedes the `copy-region-as-kill', the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5960 copies the text into a separate entry in the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5961
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5962 The complete `copy-region-as-kill' function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5963 ------------------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5964
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5965 Here is the complete text of the version 21 `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5966 function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5967
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5968 (defun copy-region-as-kill (beg end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5969 "Save the region as if killed, but don't kill it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5970 In Transient Mark mode, deactivate the mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5971 If `interprogram-cut-function' is non-nil, also save
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5972 the text for a window system cut and paste."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5973 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5974 (if (eq last-command 'kill-region)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5975 (kill-append (buffer-substring beg end) (< end beg))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5976 (kill-new (buffer-substring beg end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5977 (if transient-mark-mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5978 (setq deactivate-mark t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5979 nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5980
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5981 As usual, this function can be divided into its component parts:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5982
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5983 (defun copy-region-as-kill (ARGUMENT-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5984 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5985 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5986 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5987
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5988 The arguments are `beg' and `end' and the function is interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5989 with `"r"', so the two arguments must refer to the beginning and end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5990 of the region. If you have been reading though this document from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5991 the beginning, understanding these parts of a function is almost
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5992 becoming routine.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5993
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5994 The documentation is somewhat confusing unless you remember that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5995 word `kill' has a meaning different from its usual meaning. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5996 `Transient Mark' and `interprogram-cut-function' comments explain
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5997 certain side-effects.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5998
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
5999 After you once set a mark, a buffer always contains a region. If you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6000 wish, you can use Transient Mark mode to highlight the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6001 temporarily. (No one wants to highlight the region all the time, so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6002 Transient Mark mode highlights it only at appropriate times. Many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6003 people turn off Transient Mark mode, so the region is never
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6004 highlighted.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6006 Also, a windowing system allows you to copy, cut, and paste among
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6007 different programs. In the X windowing system, for example, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6008 `interprogram-cut-function' function is `x-select-text', which works
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6009 with the windowing system's equivalent of the Emacs kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6010
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6011 The body of the `copy-region-as-kill' function starts with an `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6012 clause. What this clause does is distinguish between two different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6013 situations: whether or not this command is executed immediately after
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6014 a previous `kill-region' command. In the first case, the new region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6015 is appended to the previously copied text. Otherwise, it is inserted
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6016 into the beginning of the kill ring as a separate piece of text from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6017 the previous piece.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6018
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6019 The last two lines of the function prevent the region from lighting up
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6020 if Transient Mark mode is turned on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6021
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6022 The body of `copy-region-as-kill' merits discussion in detail.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6023
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6024 The Body of `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6025 ---------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6026
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6027 The `copy-region-as-kill' function works in much the same way as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6028 `kill-region' function (*note `kill-region': kill-region.). Both are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6029 written so that two or more kills in a row combine their text into a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6030 single entry. If you yank back the text from the kill ring, you get
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6031 it all in one piece. Moreover, kills that kill forward from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6032 current position of the cursor are added to the end of the previously
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6033 copied text and commands that copy text backwards add it to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6034 beginning of the previously copied text. This way, the words in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6035 text stay in the proper order.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6036
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6037 Like `kill-region', the `copy-region-as-kill' function makes use of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6038 the `last-command' variable that keeps track of the previous Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6039 command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6040
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6041 `last-command' and `this-command'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6042 .................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6044 Normally, whenever a function is executed, Emacs sets the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6045 `this-command' to the function being executed (which in this case
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6046 would be `copy-region-as-kill'). At the same time, Emacs sets the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6047 value of `last-command' to the previous value of `this-command'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6048
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6049 In the first part of the body of the `copy-region-as-kill' function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6050 an `if' expression determines whether the value of `last-command' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6051 `kill-region'. If so, the then-part of the `if' expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6052 evaluated; it uses the `kill-append' function to concatenate the text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6053 copied at this call to the function with the text already in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6054 first element (the CAR) of the kill ring. On the other hand, if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6055 value of `last-command' is not `kill-region', then the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6056 `copy-region-as-kill' function attaches a new element to the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6057 ring using the `kill-new' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6058
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6059 The `if' expression reads as follows; it uses `eq', which is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6060 function we have not yet seen:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6062 (if (eq last-command 'kill-region)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6063 ;; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6064 (kill-append (buffer-substring beg end) (< end beg))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6065 ;; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6066 (kill-new (buffer-substring beg end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6067
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6068 The `eq' function tests whether its first argument is the same Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6069 object as its second argument. The `eq' function is similar to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6070 `equal' function in that it is used to test for equality, but differs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6071 in that it determines whether two representations are actually the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6072 same object inside the computer, but with different names. `equal'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6073 determines whether the structure and contents of two expressions are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6074 the same.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6075
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6076 If the previous command was `kill-region', then the Emacs Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6077 interpreter calls the `kill-append' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6078
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6079 The `kill-append' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6080 ..........................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6081
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6082 The `kill-append' function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6083
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6084 (defun kill-append (string before-p)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6085 "Append STRING to the end of the latest kill in the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6086 If BEFORE-P is non-nil, prepend STRING to the kill.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6087 If `interprogram-cut-function' is set, pass the resulting kill to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6088 it."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6089 (kill-new (if before-p
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6090 (concat string (car kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6091 (concat (car kill-ring) string))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6092 t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6093
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6094 The `kill-append' function is fairly straightforward. It uses the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6095 `kill-new' function, which we will discuss in more detail in a moment.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6096
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6097 First, let us look at the conditional that is one of the two arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6098 to `kill-new'. It uses `concat' to concatenate the new text to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6099 CAR of the kill ring. Whether it prepends or appends the text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6100 depends on the results of an `if' expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6101
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6102 (if before-p ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6103 (concat string (car kill-ring)) ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6104 (concat (car kill-ring) string)) ; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6105
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6106 If the region being killed is before the region that was killed in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6107 last command, then it should be prepended before the material that was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6108 saved in the previous kill; and conversely, if the killed text follows
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6109 what was just killed, it should be appended after the previous text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6110 The `if' expression depends on the predicate `before-p' to decide
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6111 whether the newly saved text should be put before or after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6112 previously saved text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6113
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6114 The symbol `before-p' is the name of one of the arguments to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6115 `kill-append'. When the `kill-append' function is evaluated, it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6116 bound to the value returned by evaluating the actual argument. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6117 this case, this is the expression `(< end beg)'. This expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6118 does not directly determine whether the killed text in this command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6119 is located before or after the kill text of the last command; what is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6120 does is determine whether the value of the variable `end' is less
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6121 than the value of the variable `beg'. If it is, it means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6122 user is most likely heading towards the beginning of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6123 Also, the result of evaluating the predicate expression, `(< end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6124 beg)', will be true and the text will be prepended before the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6125 previous text. On the other hand, if the value of the variable `end'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6126 is greater than the value of the variable `beg', the text will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6127 appended after the previous text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6128
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6129 When the newly saved text will be prepended, then the string with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6130 new text will be concatenated before the old text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6131
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6132 (concat string (car kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6133
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6134 But if the text will be appended, it will be concatenated after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6135 old text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6136
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6137 (concat (car kill-ring) string))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6138
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6139 To understand how this works, we first need to review the `concat'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6140 function. The `concat' function links together or unites two strings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6141 of text. The result is a string. For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6142
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6143 (concat "abc" "def")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6144 => "abcdef"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6145
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6146 (concat "new "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6147 (car '("first element" "second element")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6148 => "new first element"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6149
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6150 (concat (car
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6151 '("first element" "second element")) " modified")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6152 => "first element modified"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6153
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6154 We can now make sense of `kill-append': it modifies the contents of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6155 the kill ring. The kill ring is a list, each element of which is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6156 saved text. The `kill-append' function uses the `kill-new' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6157 which in turn uses the `setcar' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6159 The `kill-new' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6160 .......................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6162 The `kill-new' function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6163
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6164 (defun kill-new (string &optional replace)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6165 "Make STRING the latest kill in the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6166 Set the kill-ring-yank pointer to point to it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6167 If `interprogram-cut-function' is non-nil, apply it to STRING.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6168 Optional second argument REPLACE non-nil means that STRING will replace
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6169 the front of the kill ring, rather than being added to the list."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6170 (and (fboundp 'menu-bar-update-yank-menu)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6171 (menu-bar-update-yank-menu string (and replace (car kill-ring))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6172 (if (and replace kill-ring)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6173 (setcar kill-ring string)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6174 (setq kill-ring (cons string kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6175 (if (> (length kill-ring) kill-ring-max)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6176 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6177 (setq kill-ring-yank-pointer kill-ring)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6178 (if interprogram-cut-function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6179 (funcall interprogram-cut-function string (not replace))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6180
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6181 As usual, we can look at this function in parts.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6182
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6183 The first line of the documentation makes sense:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6184
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6185 Make STRING the latest kill in the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6186
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6187 Let's skip over the rest of the documentation for the moment.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6188
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6189 Also, let's skip over the first two lines of code, those involving
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6190 `menu-bar-update-yank-menu'. We will explain them below.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6191
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6192 The critical lines are these:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6193
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6194 (if (and replace kill-ring)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6195 ;; then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6196 (setcar kill-ring string)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6197 ;; else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6198 (setq kill-ring (cons string kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6199 (if (> (length kill-ring) kill-ring-max)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6200 ;; avoid overly long kill ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6201 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6202 (setq kill-ring-yank-pointer kill-ring)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6203 (if interprogram-cut-function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6204 (funcall interprogram-cut-function string (not replace))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6205
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6206 The conditional test is `(and replace kill-ring)'. This will be true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6207 when two conditions are met: the kill ring has something in it, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6208 the `replace' variable is true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6209
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6210 The `kill-append' function sets `replace' to be true; then, when the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6211 kill ring has at least one item in it, the `setcar' expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6212 executed:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6213
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6214 (setcar kill-ring string)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6215
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6216 The `setcar' function actually changes the first element of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6217 `kill-ring' list to the value of `string'. It replaces the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6218 element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6219
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6220 On the other hand, if the kill ring is empty, or replace is false, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6221 else-part of the condition is executed:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6223 (setq kill-ring (cons string kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6224 (if (> (length kill-ring) kill-ring-max)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6225 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6226
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6227 This expression first constructs a new version of the kill ring by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6228 prepending `string' to the existing kill ring as a new element. Then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6229 it executes a second `if' clause. This second `if' clause keeps the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6230 kill ring from growing too long.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6231
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6232 Let's look at these two expressions in order.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6233
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6234 The `setq' line of the else-part sets the new value of the kill ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6235 to what results from adding the string being killed to the old kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6236 ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6237
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6238 We can see how this works with an example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6239
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6240 (setq example-list '("here is a clause" "another clause"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6241
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6242 After evaluating this expression with `C-x C-e', you can evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6243 `example-list' and see what it returns:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6244
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6245 example-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6246 => ("here is a clause" "another clause")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6247
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6248 Now, we can add a new element on to this list by evaluating the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6249 following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6250
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6251 (setq example-list (cons "a third clause" example-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6252
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6253 When we evaluate `example-list', we find its value is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6254
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6255 example-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6256 => ("a third clause" "here is a clause" "another clause")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6257
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6258 Thus, the third clause was added to the list by `cons'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6259
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6260 This is exactly similar to what the `setq' and `cons' do in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6261 function. Here is the line again:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6262
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6263 (setq kill-ring (cons string kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6264
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6265 Now for the second part of the `if' clause. This expression keeps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6266 the kill ring from growing too long. It looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6267
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6268 (if (> (length kill-ring) kill-ring-max)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6269 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6270
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6271 The code checks whether the length of the kill ring is greater than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6272 the maximum permitted length. This is the value of `kill-ring-max'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6273 (which is 60, by default). If the length of the kill ring is too
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6274 long, then this code sets the last element of the kill ring to `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6275 It does this by using two functions, `nthcdr' and `setcdr'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6276
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6277 We looked at `setcdr' earlier (*note `setcdr': setcdr.). It sets the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6278 CDR of a list, just as `setcar' sets the CAR of a list. In this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6279 case, however, `setcdr' will not be setting the CDR of the whole kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6280 ring; the `nthcdr' function is used to cause it to set the CDR of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6281 next to last element of the kill ring--this means that since the CDR
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6282 of the next to last element is the last element of the kill ring, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6283 will set the last element of the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6284
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6285 The `nthcdr' function works by repeatedly taking the CDR of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6286 list--it takes the CDR of the CDR of the CDR ... It does this N
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6287 times and returns the results.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6288
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6289 Thus, if we had a four element list that was supposed to be three
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6290 elements long, we could set the CDR of the next to last element to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6291 `nil', and thereby shorten the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6293 You can see this by evaluating the following three expressions in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6294 turn. First set the value of `trees' to `(maple oak pine birch)',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6295 then set the CDR of its second CDR to `nil' and then find the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6296 of `trees':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6297
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6298 (setq trees '(maple oak pine birch))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6299 => (maple oak pine birch)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6300
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6301 (setcdr (nthcdr 2 trees) nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6302 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6303
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6304 trees
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6305 => (maple oak pine)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6306
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6307 (The value returned by the `setcdr' expression is `nil' since that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6308 what the CDR is set to.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6309
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6310 To repeat, in `kill-new', the `nthcdr' function takes the CDR a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6311 number of times that is one less than the maximum permitted size of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6312 the kill ring and sets the CDR of that element (which will be the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6313 rest of the elements in the kill ring) to `nil'. This prevents the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6314 kill ring from growing too long.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6315
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6316 The next to last expression in the `kill-new' function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6317
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6318 (setq kill-ring-yank-pointer kill-ring)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6319
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6320 The `kill-ring-yank-pointer' is a global variable that is set to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6321 the `kill-ring'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6322
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6323 Even though the `kill-ring-yank-pointer' is called a `pointer', it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6324 a variable just like the kill ring. However, the name has been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6325 chosen to help humans understand how the variable is used. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6326 variable is used in functions such as `yank' and `yank-pop' (*note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6327 Yanking Text Back: Yanking.).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6329 Now, to return to the first two lines in the body of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6331 (and (fboundp 'menu-bar-update-yank-menu)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6332 (menu-bar-update-yank-menu string (and replace (car kill-ring))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6333
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6334 This is an expression whose first element is the function `and'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6335
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6336 The `and' special form evaluates each of its arguments until one of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6337 the arguments returns a value of `nil', in which case the `and'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6338 expression returns `nil'; however, if none of the arguments returns a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6339 value of `nil', the value resulting from evaluating the last argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6340 is returned. (Since such a value is not `nil', it is considered true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6341 in Emacs Lisp.) In other words, an `and' expression returns a true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6342 value only if all its arguments are true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6343
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6344 In this case, the expression tests first to see whether
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6345 `menu-bar-update-yank-menu' exists as a function, and if so, calls
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6346 it. The `fboundp' function returns true if the symbol it is testing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6347 has a function definition that `is not void'. If the symbol's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6348 function definition were void, we would receive an error message, as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6349 we did when we created errors intentionally (*note Generate an Error
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6350 Message: Making Errors.).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6351
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6352 Essentially, the `and' is an `if' expression that reads like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6353
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6354 if THE-MENU-BAR-FUNCTION-EXISTS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6355 then EXECUTE-IT
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6356
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6357 `menu-bar-update-yank-menu' is one of the functions that make it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6358 possible to use the `Select and Paste' menu in the Edit item of a menu
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6359 bar; using a mouse, you can look at the various pieces of text you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6360 have saved and select one piece to paste.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6361
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6362 Finally, the last expression in the `kill-new' function adds the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6363 newly copied string to whatever facility exists for copying and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6364 pasting among different programs running in a windowing system. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6365 the X Windowing system, for example, the `x-select-text' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6366 takes the string and stores it in memory operated by X. You can paste
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6367 the string in another program, such as an Xterm.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6368
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6369 The expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6370
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6371 (if interprogram-cut-function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6372 (funcall interprogram-cut-function string (not replace))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6373
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6374 If an `interprogram-cut-function' exists, then Emacs executes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6375 `funcall', which in turn calls its first argument as a function and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6376 passes the remaining arguments to it. (Incidentally, as far as I can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6377 see, this `if' expression could be replaced by an `and' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6378 similar to the one in the first part of the function.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6379
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6380 We are not going to discuss windowing systems and other programs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6381 further, but merely note that this is a mechanism that enables GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6382 Emacs to work easily and well with other programs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6383
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6384 This code for placing text in the kill ring, either concatenated with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6385 an existing element or as a new element, leads us to the code for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6386 bringing back text that has been cut out of the buffer--the yank
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6387 commands. However, before discussing the yank commands, it is better
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6388 to learn how lists are implemented in a computer. This will make
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6389 clear such mysteries as the use of the term `pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6390
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6391 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6392 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6393
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6394 Here is a brief summary of some recently introduced functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6395
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6396 `car'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6397 `cdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6398 `car' returns the first element of a list; `cdr' returns the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6399 second and subsequent elements of a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6400
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6401 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6402
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6403 (car '(1 2 3 4 5 6 7))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6404 => 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6405 (cdr '(1 2 3 4 5 6 7))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6406 => (2 3 4 5 6 7)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6407
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6408 `cons'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6409 `cons' constructs a list by prepending its first argument to its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6410 second argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6411
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6412 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6413
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6414 (cons 1 '(2 3 4))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6415 => (1 2 3 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6416
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6417 `nthcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6418 Return the result of taking CDR `n' times on a list. The `rest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6419 of the rest', as it were.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6420
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6421 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6422
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6423 (nthcdr 3 '(1 2 3 4 5 6 7))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6424 => (4 5 6 7)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6425
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6426 `setcar'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6427 `setcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6428 `setcar' changes the first element of a list; `setcdr' changes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6429 the second and subsequent elements of a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6430
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6431 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6432
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6433 (setq triple '(1 2 3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6434
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6435 (setcar triple '37)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6436
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6437 triple
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6438 => (37 2 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6440 (setcdr triple '("foo" "bar"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6441
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6442 triple
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6443 => (37 "foo" "bar")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6444
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6445 `progn'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6446 Evaluate each argument in sequence and then return the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6447 the last.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6448
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6449 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6450
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6451 (progn 1 2 3 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6452 => 4
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6453
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6454 `save-restriction'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6455 Record whatever narrowing is in effect in the current buffer, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6456 any, and restore that narrowing after evaluating the arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6457
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6458 `search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6459 Search for a string, and if the string is found, move point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6460
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6461 Takes four arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6462
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6463 1. The string to search for.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6464
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6465 2. Optionally, the limit of the search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6466
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6467 3. Optionally, what to do if the search fails, return `nil' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6468 an error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6469
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6470 4. Optionally, how many times to repeat the search; if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6471 negative, the search goes backwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6472
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6473 `kill-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6474 `delete-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6475 `copy-region-as-kill'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6476 `kill-region' cuts the text between point and mark from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6477 buffer and stores that text in the kill ring, so you can get it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6478 back by yanking.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6479
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6480 `delete-and-extract-region' removes the text between point and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6481 mark from the buffer and throws it away. You cannot get it back.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6482
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6483 `copy-region-as-kill' copies the text between point and mark into
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6484 the kill ring, from which you can get it by yanking. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6485 function does not cut or remove the text from the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6486
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6487 Searching Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6488 ===================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6489
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6490 * Write an interactive function that searches for a string. If the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6491 search finds the string, leave point after it and display a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6492 message that says "Found!". (Do not use `search-forward' for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6493 the name of this function; if you do, you will overwrite the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6494 existing version of `search-forward' that comes with Emacs. Use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6495 a name such as `test-search' instead.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6496
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6497 * Write a function that prints the third element of the kill ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6498 in the echo area, if any; if the kill ring does not contain a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6499 third element, print an appropriate message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6500
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6501 How Lists are Implemented
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6502 *************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6504 In Lisp, atoms are recorded in a straightforward fashion; if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6505 implementation is not straightforward in practice, it is, nonetheless,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6506 straightforward in theory. The atom `rose', for example, is recorded
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6507 as the four contiguous letters `r', `o', `s', `e'. A list, on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6508 other hand, is kept differently. The mechanism is equally simple,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6509 but it takes a moment to get used to the idea. A list is kept using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6510 a series of pairs of pointers. In the series, the first pointer in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6511 each pair points to an atom or to another list, and the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6512 pointer in each pair points to the next pair, or to the symbol `nil',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6513 which marks the end of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6514
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6515 A pointer itself is quite simply the electronic address of what is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6516 pointed to. Hence, a list is kept as a series of electronic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6517 addresses.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6518
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6519 Lists diagrammed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6520 ================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6521
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6522 For example, the list `(rose violet buttercup)' has three elements,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6523 `rose', `violet', and `buttercup'. In the computer, the electronic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6524 address of `rose' is recorded in a segment of computer memory along
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6525 with the address that gives the electronic address of where the atom
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6526 `violet' is located; and that address (the one that tells where
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6527 `violet' is located) is kept along with an address that tells where
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6528 the address for the atom `buttercup' is located.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6529
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6530 This sounds more complicated than it is and is easier seen in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6531 diagram:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6532
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6533 ___ ___ ___ ___ ___ ___
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6534 |___|___|--> |___|___|--> |___|___|--> nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6535 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6536 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6537 --> rose --> violet --> buttercup
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6538
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6539
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6540
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6541 In the diagram, each box represents a word of computer memory that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6542 holds a Lisp object, usually in the form of a memory address. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6543 boxes, i.e. the addresses, are in pairs. Each arrow points to what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6544 the address is the address of, either an atom or another pair of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6545 addresses. The first box is the electronic address of `rose' and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6546 arrow points to `rose'; the second box is the address of the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6547 pair of boxes, the first part of which is the address of `violet' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6548 the second part of which is the address of the next pair. The very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6549 last box points to the symbol `nil', which marks the end of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6550
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6551 When a variable is set to a list with a function such as `setq', it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6552 stores the address of the first box in the variable. Thus,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6553 evaluation of the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6554
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6555 (setq bouquet '(rose violet buttercup))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6556
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6557 creates a situation like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6558
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6559 bouquet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6560 |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6561 | ___ ___ ___ ___ ___ ___
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6562 --> |___|___|--> |___|___|--> |___|___|--> nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6563 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6564 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6565 --> rose --> violet --> buttercup
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6566
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6567
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6568
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6569 In this example, the symbol `bouquet' holds the address of the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6570 pair of boxes.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6571
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6572 This same list can be illustrated in a different sort of box notation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6573 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6574
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6575 bouquet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6576 |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6577 | -------------- --------------- ----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6578 | | car | cdr | | car | cdr | | car | cdr |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6579 -->| rose | o------->| violet | o------->| butter- | nil |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6580 | | | | | | | cup | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6581 -------------- --------------- ----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6582
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6583
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6584
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6585 (Symbols consist of more than pairs of addresses, but the structure of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6586 a symbol is made up of addresses. Indeed, the symbol `bouquet'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6587 consists of a group of address-boxes, one of which is the address of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6588 the printed word `bouquet', a second of which is the address of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6589 function definition attached to the symbol, if any, a third of which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6590 is the address of the first pair of address-boxes for the list `(rose
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6591 violet buttercup)', and so on. Here we are showing that the symbol's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6592 third address-box points to the first pair of address-boxes for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6593 list.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6594
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6595 If a symbol is set to the CDR of a list, the list itself is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6596 changed; the symbol simply has an address further down the list. (In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6597 the jargon, CAR and CDR are `non-destructive'.) Thus, evaluation of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6598 the following expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6599
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6600 (setq flowers (cdr bouquet))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6601
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6602 produces this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6603
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6604
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6605 bouquet flowers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6606 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6607 | ___ ___ | ___ ___ ___ ___
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6608 --> | | | --> | | | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6609 |___|___|----> |___|___|--> |___|___|--> nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6610 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6611 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6612 --> rose --> violet --> buttercup
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6613
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6614
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6615
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6616
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6617 The value of `flowers' is `(violet buttercup)', which is to say, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6618 symbol `flowers' holds the address of the pair of address-boxes, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6619 first of which holds the address of `violet', and the second of which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6620 holds the address of `buttercup'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6621
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6622 A pair of address-boxes is called a "cons cell" or "dotted pair".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6623 *Note List Type: (elisp)List Type, and *Note Dotted Pair Notation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6624 (elisp)Dotted Pair Notation, for more information about cons cells
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6625 and dotted pairs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6626
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6627 The function `cons' adds a new pair of addresses to the front of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6628 series of addresses like that shown above. For example, evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6629 the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6630
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6631 (setq bouquet (cons 'lily bouquet))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6632
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6633 produces:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6634
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6635
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6636 bouquet flowers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6637 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6638 | ___ ___ ___ ___ | ___ ___ ___ ___
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6639 --> | | | | | | --> | | | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6640 |___|___|----> |___|___|----> |___|___|---->|___|___|--> nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6641 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6642 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6643 --> lily --> rose --> violet --> buttercup
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6644
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6645
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6646
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6647
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6648 However, this does not change the value of the symbol `flowers', as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6649 you can see by evaluating the following,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6650
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6651 (eq (cdr (cdr bouquet)) flowers)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6652
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6653 which returns `t' for true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6654
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6655 Until it is reset, `flowers' still has the value `(violet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6656 buttercup)'; that is, it has the address of the cons cell whose first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6657 address is of `violet'. Also, this does not alter any of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6658 pre-existing cons cells; they are all still there.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6659
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6660 Thus, in Lisp, to get the CDR of a list, you just get the address of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6661 the next cons cell in the series; to get the CAR of a list, you get
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6662 the address of the first element of the list; to `cons' a new element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6663 on a list, you add a new cons cell to the front of the list. That is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6664 all there is to it! The underlying structure of Lisp is brilliantly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6665 simple!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6666
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6667 And what does the last address in a series of cons cells refer to? It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6668 is the address of the empty list, of `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6669
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6670 In summary, when a Lisp variable is set to a value, it is provided
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6671 with the address of the list to which the variable refers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6672
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6673 Symbols as a Chest of Drawers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6674 =============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6675
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6676 In an earlier section, I suggested that you might imagine a symbol as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6677 being a chest of drawers. The function definition is put in one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6678 drawer, the value in another, and so on. What is put in the drawer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6679 holding the value can be changed without affecting the contents of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6680 drawer holding the function definition, and vice-versa.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6681
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6682 Actually, what is put in each drawer is the address of the value or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6683 function definition. It is as if you found an old chest in the attic,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6684 and in one of its drawers you found a map giving you directions to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6685 where the buried treasure lies.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6686
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6687 (In addition to its name, symbol definition, and variable value, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6688 symbol has a `drawer' for a "property list" which can be used to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6689 record other information. Property lists are not discussed here; see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6690 *Note Property Lists: (elisp)Property Lists.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6691
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6692 Here is a fanciful representation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6693
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6694
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6695 Chest of Drawers Contents of Drawers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6696
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6697 __ o0O0o __
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6698 / \
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6699 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6700 | directions to | [map to]
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6701 | symbol name | bouquet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6702 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6703 +---------------------+
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6704 | directions to |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6705 | symbol definition | [none]
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6706 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6707 +---------------------+
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6708 | directions to | [map to]
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6709 | variable value | (rose violet buttercup)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6710 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6711 +---------------------+
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6712 | directions to |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6713 | property list | [not described here]
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6714 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6715 +---------------------+
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6716 |/ \|
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6717
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6718
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6719
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6720
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6721 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6722 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6723
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6724 Set `flowers' to `violet' and `buttercup'. Cons two more flowers on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6725 to this list and set this new list to `more-flowers'. Set the CAR of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6726 `flowers' to a fish. What does the `more-flowers' list now contain?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6727
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6728 Yanking Text Back
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6729 *****************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6730
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6731 Whenever you cut text out of a buffer with a `kill' command in GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6732 Emacs, you can bring it back with a `yank' command. The text that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6733 cut out of the buffer is put in the kill ring and the yank commands
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6734 insert the appropriate contents of the kill ring back into a buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6735 (not necessarily the original buffer).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6736
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6737 A simple `C-y' (`yank') command inserts the first item from the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6738 ring into the current buffer. If the `C-y' command is followed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6739 immediately by `M-y', the first element is replaced by the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6740 element. Successive `M-y' commands replace the second element with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6741 the third, fourth, or fifth element, and so on. When the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6742 element in the kill ring is reached, it is replaced by the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6743 element and the cycle is repeated. (Thus the kill ring is called a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6744 `ring' rather than just a `list'. However, the actual data structure
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6745 that holds the text is a list. *Note Handling the Kill Ring: Kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6746 Ring, for the details of how the list is handled as a ring.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6747
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6748 Kill Ring Overview
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6749 ==================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6750
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6751 The kill ring is a list of textual strings. This is what it looks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6752 like:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6753
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6754 ("some text" "a different piece of text" "yet more text")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6755
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6756 If this were the contents of my kill ring and I pressed `C-y', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6757 string of characters saying `some text' would be inserted in this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6758 buffer where my cursor is located.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6759
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6760 The `yank' command is also used for duplicating text by copying it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6761 The copied text is not cut from the buffer, but a copy of it is put
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6762 on the kill ring and is inserted by yanking it back.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6763
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6764 Three functions are used for bringing text back from the kill ring:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6765 `yank', which is usually bound to `C-y'; `yank-pop', which is usually
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6766 bound to `M-y'; and `rotate-yank-pointer', which is used by the two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6767 other functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6768
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6769 These functions refer to the kill ring through a variable called the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6770 `kill-ring-yank-pointer'. Indeed, the insertion code for both the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6771 `yank' and `yank-pop' functions is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6772
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6773 (insert (car kill-ring-yank-pointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6774
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6775 To begin to understand how `yank' and `yank-pop' work, it is first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6776 necessary to look at the `kill-ring-yank-pointer' variable and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6777 `rotate-yank-pointer' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6778
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6779 The `kill-ring-yank-pointer' Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6780 =====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6782 `kill-ring-yank-pointer' is a variable, just as `kill-ring' is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6783 variable. It points to something by being bound to the value of what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6784 it points to, like any other Lisp variable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6785
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6786 Thus, if the value of the kill ring is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6787
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6788 ("some text" "a different piece of text" "yet more text")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6789
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6790 and the `kill-ring-yank-pointer' points to the second clause, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6791 value of `kill-ring-yank-pointer' is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6792
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6793 ("a different piece of text" "yet more text")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6794
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6795 As explained in the previous chapter (*note List Implementation::),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6796 the computer does not keep two different copies of the text being
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6797 pointed to by both the `kill-ring' and the `kill-ring-yank-pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6798 The words "a different piece of text" and "yet more text" are not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6799 duplicated. Instead, the two Lisp variables point to the same pieces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6800 of text. Here is a diagram:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6801
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6802 kill-ring kill-ring-yank-pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6803 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6804 | ___ ___ | ___ ___ ___ ___
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6805 ---> | | | --> | | | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6806 |___|___|----> |___|___|--> |___|___|--> nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6807 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6808 | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6809 | | --> "yet more text"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6810 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6811 | --> "a different piece of text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6812 |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6813 --> "some text"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6814
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6816
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6817
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6818 Both the variable `kill-ring' and the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6819 `kill-ring-yank-pointer' are pointers. But the kill ring itself is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6820 usually described as if it were actually what it is composed of. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6821 `kill-ring' is spoken of as if it were the list rather than that it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6822 points to the list. Conversely, the `kill-ring-yank-pointer' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6823 spoken of as pointing to a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6824
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6825 These two ways of talking about the same thing sound confusing at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6826 first but make sense on reflection. The kill ring is generally
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6827 thought of as the complete structure of data that holds the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6828 information of what has recently been cut out of the Emacs buffers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6829 The `kill-ring-yank-pointer' on the other hand, serves to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6830 indicate--that is, to `point to'--that part of the kill ring of which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6831 the first element (the CAR) will be inserted.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6832
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6833 The `rotate-yank-pointer' function changes the element in the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6834 ring to which the `kill-ring-yank-pointer' points; when the pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6835 is set to point to the next element beyond the end of the kill ring,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6836 it automatically sets it to point to the first element of the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6837 ring. This is how the list is transformed into a ring. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6838 `rotate-yank-pointer' function itself is not difficult, but contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6839 many details. It and the much simpler `yank' and `yank-pop'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6840 functions are described in an appendix. *Note Handling the Kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6841 Ring: Kill Ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6842
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6843 Exercises with `yank' and `nthcdr'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6844 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6845
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6846 * Using `C-h v' (`describe-variable'), look at the value of your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6847 kill ring. Add several items to your kill ring; look at its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6848 value again. Using `M-y' (`yank-pop)', move all the way around
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6849 the kill ring. How many items were in your kill ring? Find the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6850 value of `kill-ring-max'. Was your kill ring full, or could you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6851 have kept more blocks of text within it?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6852
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6853 * Using `nthcdr' and `car', construct a series of expressions to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6854 return the first, second, third, and fourth elements of a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6855
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6856 Loops and Recursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6857 *******************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6858
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6859 Emacs Lisp has two primary ways to cause an expression, or a series of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6860 expressions, to be evaluated repeatedly: one uses a `while' loop, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6861 the other uses "recursion".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6862
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6863 Repetition can be very valuable. For example, to move forward four
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6864 sentences, you need only write a program that will move forward one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6865 sentence and then repeat the process four times. Since a computer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6866 does not get bored or tired, such repetitive action does not have the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6867 deleterious effects that excessive or the wrong kinds of repetition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6868 can have on humans.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6869
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6870 People mostly write Emacs Lisp functions using `while' loops and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6871 their kin; but you can use recursion, which provides a very powerful
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6872 way to think about and then to solve problems(1).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6873
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6874 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6875
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6876 (1) You can write recursive functions to be frugal or wasteful of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6877 mental or computer resources; as it happens, methods that people find
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6878 easy--that are frugal of `mental resources'--sometimes use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6879 considerable computer resources. Emacs was designed to run on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6880 machines that we now consider limited and its default settings are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6881 conservative. You may want to increase the values of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6882 `max-specpdl-size' and `max-lisp-eval-depth'. In my `.emacs' file, I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6883 set them to 15 and 30 times their default value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6884
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6885 `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6886 =======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6888 The `while' special form tests whether the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6889 evaluating its first argument is true or false. This is similar to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6890 what the Lisp interpreter does with an `if'; what the interpreter does
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6891 next, however, is different.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6892
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6893 In a `while' expression, if the value returned by evaluating the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6894 first argument is false, the Lisp interpreter skips the rest of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6895 expression (the "body" of the expression) and does not evaluate it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6896 However, if the value is true, the Lisp interpreter evaluates the body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6897 of the expression and then again tests whether the first argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6898 `while' is true or false. If the value returned by evaluating the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6899 first argument is again true, the Lisp interpreter again evaluates the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6900 body of the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6901
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6902 The template for a `while' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6903
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6904 (while TRUE-OR-FALSE-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6905 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6906
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6907 Looping with `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6908 --------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6909
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6910 So long as the true-or-false-test of the `while' expression returns a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6911 true value when it is evaluated, the body is repeatedly evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6912 This process is called a loop since the Lisp interpreter repeats the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6913 same thing again and again, like an airplane doing a loop. When the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6914 result of evaluating the true-or-false-test is false, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6915 interpreter does not evaluate the rest of the `while' expression and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6916 `exits the loop'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6917
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6918 Clearly, if the value returned by evaluating the first argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6919 `while' is always true, the body following will be evaluated again
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6920 and again ... and again ... forever. Conversely, if the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6921 returned is never true, the expressions in the body will never be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6922 evaluated. The craft of writing a `while' loop consists of choosing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6923 a mechanism such that the true-or-false-test returns true just the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6924 number of times that you want the subsequent expressions to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6925 evaluated, and then have the test return false.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6926
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6927 The value returned by evaluating a `while' is the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6928 true-or-false-test. An interesting consequence of this is that a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6929 `while' loop that evaluates without error will return `nil' or false
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6930 regardless of whether it has looped 1 or 100 times or none at all. A
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6931 `while' expression that evaluates successfully never returns a true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6932 value! What this means is that `while' is always evaluated for its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6933 side effects, which is to say, the consequences of evaluating the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6934 expressions within the body of the `while' loop. This makes sense.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6935 It is not the mere act of looping that is desired, but the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6936 consequences of what happens when the expressions in the loop are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6937 repeatedly evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6938
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6939 A `while' Loop and a List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6940 -------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6941
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6942 A common way to control a `while' loop is to test whether a list has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6943 any elements. If it does, the loop is repeated; but if it does not,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6944 the repetition is ended. Since this is an important technique, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6945 will create a short example to illustrate it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6946
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6947 A simple way to test whether a list has elements is to evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6948 list: if it has no elements, it is an empty list and will return the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6949 empty list, `()', which is a synonym for `nil' or false. On the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6950 other hand, a list with elements will return those elements when it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6951 is evaluated. Since Emacs Lisp considers as true any value that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6952 not `nil', a list that returns elements will test true in a `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6953 loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6954
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6955 For example, you can set the variable `empty-list' to `nil' by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6956 evaluating the following `setq' expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6957
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6958 (setq empty-list ())
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6959
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6960 After evaluating the `setq' expression, you can evaluate the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6961 `empty-list' in the usual way, by placing the cursor after the symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6962 and typing `C-x C-e'; `nil' will appear in your echo area:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6963
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6964 empty-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6965
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6966 On the other hand, if you set a variable to be a list with elements,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6967 the list will appear when you evaluate the variable, as you can see by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6968 evaluating the following two expressions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6969
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6970 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6971
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6972 animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6973
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6974 Thus, to create a `while' loop that tests whether there are any items
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6975 in the list `animals', the first part of the loop will be written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6976 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6977
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6978 (while animals
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6979 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6980
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6981 When the `while' tests its first argument, the variable `animals' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6982 evaluated. It returns a list. So long as the list has elements, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6983 `while' considers the results of the test to be true; but when the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6984 list is empty, it considers the results of the test to be false.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6985
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6986 To prevent the `while' loop from running forever, some mechanism
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6987 needs to be provided to empty the list eventually. An oft-used
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6988 technique is to have one of the subsequent forms in the `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6989 expression set the value of the list to be the CDR of the list. Each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6990 time the `cdr' function is evaluated, the list will be made shorter,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6991 until eventually only the empty list will be left. At this point,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6992 the test of the `while' loop will return false, and the arguments to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6993 the `while' will no longer be evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6994
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6995 For example, the list of animals bound to the variable `animals' can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6996 be set to be the CDR of the original list with the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6997 expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6998
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
6999 (setq animals (cdr animals))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7000
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7001 If you have evaluated the previous expressions and then evaluate this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7002 expression, you will see `(giraffe lion tiger)' appear in the echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7003 area. If you evaluate the expression again, `(lion tiger)' will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7004 appear in the echo area. If you evaluate it again and yet again,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7005 `(tiger)' appears and then the empty list, shown by `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7006
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7007 A template for a `while' loop that uses the `cdr' function repeatedly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7008 to cause the true-or-false-test eventually to test false looks like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7009 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7010
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7011 (while TEST-WHETHER-LIST-IS-EMPTY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7012 BODY...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7013 SET-LIST-TO-CDR-OF-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7014
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7015 This test and use of `cdr' can be put together in a function that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7016 goes through a list and prints each element of the list on a line of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7017 its own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7018
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7019 An Example: `print-elements-of-list'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7020 ------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7021
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7022 The `print-elements-of-list' function illustrates a `while' loop with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7023 a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7024
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7025 The function requires several lines for its output. If you are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7026 reading this in Emacs 21 or a later version, you can evaluate the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7027 following expression inside of Info, as usual.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7028
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7029 If you are using an earlier version of Emacs, you need to copy the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7030 necessary expressions to your `*scratch*' buffer and evaluate them
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7031 there. This is because the echo area had only one line in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7032 earlier versions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7033
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7034 You can copy the expressions by marking the beginning of the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7035 with `C-<SPC>' (`set-mark-command'), moving the cursor to the end of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7036 the region and then copying the region using `M-w'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7037 (`copy-region-as-kill'). In the `*scratch*' buffer, you can yank the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7038 expressions back by typing `C-y' (`yank').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7039
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7040 After you have copied the expressions to the `*scratch*' buffer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7041 evaluate each expression in turn. Be sure to evaluate the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7042 expression, `(print-elements-of-list animals)', by typing `C-u C-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7043 C-e', that is, by giving an argument to `eval-last-sexp'. This will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7044 cause the result of the evaluation to be printed in the `*scratch*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7045 buffer instead of being printed in the echo area. (Otherwise you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7046 will see something like this in your echo area:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7047 `^Jgazelle^J^Jgiraffe^J^Jlion^J^Jtiger^Jnil', in which each `^J'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7048 stands for a `newline'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7049
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7050 If you are using Emacs 21 or later, you can evaluate these expressions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7051 directly in the Info buffer, and the echo area will grow to show the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7052 results.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7053
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7054 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7055
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7056 (defun print-elements-of-list (list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7057 "Print each element of LIST on a line of its own."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7058 (while list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7059 (print (car list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7060 (setq list (cdr list))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7062 (print-elements-of-list animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7063
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7064 When you evaluate the three expressions in sequence, you will see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7065 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7066
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7067 gazelle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7068
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7069 giraffe
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7070
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7071 lion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7072
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7073 tiger
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7074 nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7075
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7076 Each element of the list is printed on a line of its own (that is what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7077 the function `print' does) and then the value returned by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7078 function is printed. Since the last expression in the function is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7079 `while' loop, and since `while' loops always return `nil', a `nil' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7080 printed after the last element of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7081
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7082 A Loop with an Incrementing Counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7083 -----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7084
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7085 A loop is not useful unless it stops when it ought. Besides
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7086 controlling a loop with a list, a common way of stopping a loop is to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7087 write the first argument as a test that returns false when the correct
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7088 number of repetitions are complete. This means that the loop must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7089 have a counter--an expression that counts how many times the loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7090 repeats itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7091
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7092 The test can be an expression such as `(< count desired-number)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7093 which returns `t' for true if the value of `count' is less than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7094 `desired-number' of repetitions and `nil' for false if the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7095 `count' is equal to or is greater than the `desired-number'. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7096 expression that increments the count can be a simple `setq' such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7097 `(setq count (1+ count))', where `1+' is a built-in function in Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7098 Lisp that adds 1 to its argument. (The expression `(1+ count)' has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7099 the same result as `(+ count 1)', but is easier for a human to read.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7101 The template for a `while' loop controlled by an incrementing counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7102 looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7103
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7104 SET-COUNT-TO-INITIAL-VALUE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7105 (while (< count desired-number) ; true-or-false-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7106 BODY...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7107 (setq count (1+ count))) ; incrementer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7108
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7109 Note that you need to set the initial value of `count'; usually it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7110 set to 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7112 Example with incrementing counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7113 .................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7114
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7115 Suppose you are playing on the beach and decide to make a triangle of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7116 pebbles, putting one pebble in the first row, two in the second row,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7117 three in the third row and so on, like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7118
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7119
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7120 *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7121 * *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7122 * * *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7123 * * * *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7124
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7125
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7126 (About 2500 years ago, Pythagoras and others developed the beginnings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7127 of number theory by considering questions such as this.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7128
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7129 Suppose you want to know how many pebbles you will need to make a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7130 triangle with 7 rows?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7131
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7132 Clearly, what you need to do is add up the numbers from 1 to 7. There
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7133 are two ways to do this; start with the smallest number, one, and add
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7134 up the list in sequence, 1, 2, 3, 4 and so on; or start with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7135 largest number and add the list going down: 7, 6, 5, 4 and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7136 Because both mechanisms illustrate common ways of writing `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7137 loops, we will create two examples, one counting up and the other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7138 counting down. In this first example, we will start with 1 and add
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7139 2, 3, 4 and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7140
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7141 If you are just adding up a short list of numbers, the easiest way to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7142 do it is to add up all the numbers at once. However, if you do not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7143 know ahead of time how many numbers your list will have, or if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7144 want to be prepared for a very long list, then you need to design
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7145 your addition so that what you do is repeat a simple process many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7146 times instead of doing a more complex process once.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7147
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7148 For example, instead of adding up all the pebbles all at once, what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7149 you can do is add the number of pebbles in the first row, 1, to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7150 number in the second row, 2, and then add the total of those two rows
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7151 to the third row, 3. Then you can add the number in the fourth row,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7152 4, to the total of the first three rows; and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7153
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7154 The critical characteristic of the process is that each repetitive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7155 action is simple. In this case, at each step we add only two numbers,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7156 the number of pebbles in the row and the total already found. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7157 process of adding two numbers is repeated again and again until the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7158 last row has been added to the total of all the preceding rows. In a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7159 more complex loop the repetitive action might not be so simple, but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7160 it will be simpler than doing everything all at once.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7162 The parts of the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7163 ....................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7164
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7165 The preceding analysis gives us the bones of our function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7166 first, we will need a variable that we can call `total' that will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7167 the total number of pebbles. This will be the value returned by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7168 function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7169
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7170 Second, we know that the function will require an argument: this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7171 argument will be the total number of rows in the triangle. It can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7172 called `number-of-rows'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7173
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7174 Finally, we need a variable to use as a counter. We could call this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7175 variable `counter', but a better name is `row-number'. That is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7176 because what the counter does is count rows, and a program should be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7177 written to be as understandable as possible.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7178
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7179 When the Lisp interpreter first starts evaluating the expressions in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7180 the function, the value of `total' should be set to zero, since we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7181 have not added anything to it. Then the function should add the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7182 number of pebbles in the first row to the total, and then add the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7183 number of pebbles in the second to the total, and then add the number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7184 of pebbles in the third row to the total, and so on, until there are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7185 no more rows left to add.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7186
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7187 Both `total' and `row-number' are used only inside the function, so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7188 they can be declared as local variables with `let' and given initial
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7189 values. Clearly, the initial value for `total' should be 0. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7190 initial value of `row-number' should be 1, since we start with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7191 first row. This means that the `let' statement will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7192
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7193 (let ((total 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7194 (row-number 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7195 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7197 After the internal variables are declared and bound to their initial
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7198 values, we can begin the `while' loop. The expression that serves as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7199 the test should return a value of `t' for true so long as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7200 `row-number' is less than or equal to the `number-of-rows'. (If the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7201 expression tests true only so long as the row number is less than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7202 number of rows in the triangle, the last row will never be added to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7203 the total; hence the row number has to be either less than or equal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7204 to the number of rows.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7205
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7206 Lisp provides the `<=' function that returns true if the value of its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7207 first argument is less than or equal to the value of its second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7208 argument and false otherwise. So the expression that the `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7209 will evaluate as its test should look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7210
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7211 (<= row-number number-of-rows)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7213 The total number of pebbles can be found by repeatedly adding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7214 number of pebbles in a row to the total already found. Since the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7215 number of pebbles in the row is equal to the row number, the total
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7216 can be found by adding the row number to the total. (Clearly, in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7217 more complex situation, the number of pebbles in the row might be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7218 related to the row number in a more complicated way; if this were the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7219 case, the row number would be replaced by the appropriate expression.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7220
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7221 (setq total (+ total row-number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7223 What this does is set the new value of `total' to be equal to the sum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7224 of adding the number of pebbles in the row to the previous total.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7226 After setting the value of `total', the conditions need to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7227 established for the next repetition of the loop, if there is one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7228 This is done by incrementing the value of the `row-number' variable,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7229 which serves as a counter. After the `row-number' variable has been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7230 incremented, the true-or-false-test at the beginning of the `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7231 loop tests whether its value is still less than or equal to the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7232 of the `number-of-rows' and if it is, adds the new value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7233 `row-number' variable to the `total' of the previous repetition of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7234 the loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7235
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7236 The built-in Emacs Lisp function `1+' adds 1 to a number, so the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7237 `row-number' variable can be incremented with this expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7238
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7239 (setq row-number (1+ row-number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7241 Putting the function definition together
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7242 ........................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7243
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7244 We have created the parts for the function definition; now we need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7245 put them together.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7246
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7247 First, the contents of the `while' expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7248
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7249 (while (<= row-number number-of-rows) ; true-or-false-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7250 (setq total (+ total row-number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7251 (setq row-number (1+ row-number))) ; incrementer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7252
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7253 Along with the `let' expression varlist, this very nearly completes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7254 the body of the function definition. However, it requires one final
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7255 element, the need for which is somewhat subtle.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7256
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7257 The final touch is to place the variable `total' on a line by itself
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7258 after the `while' expression. Otherwise, the value returned by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7259 whole function is the value of the last expression that is evaluated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7260 in the body of the `let', and this is the value returned by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7261 `while', which is always `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7262
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7263 This may not be evident at first sight. It almost looks as if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7264 incrementing expression is the last expression of the whole function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7265 But that expression is part of the body of the `while'; it is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7266 last element of the list that starts with the symbol `while'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7267 Moreover, the whole of the `while' loop is a list within the body of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7268 the `let'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7269
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7270 In outline, the function will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7271
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7272 (defun NAME-OF-FUNCTION (ARGUMENT-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7273 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7274 (let (VARLIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7275 (while (TRUE-OR-FALSE-TEST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7276 BODY-OF-WHILE... )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7277 ... ) ; Need final expression here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7278
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7279 The result of evaluating the `let' is what is going to be returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7280 the `defun' since the `let' is not embedded within any containing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7281 list, except for the `defun' as a whole. However, if the `while' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7282 the last element of the `let' expression, the function will always
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7283 return `nil'. This is not what we want! Instead, what we want is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7284 the value of the variable `total'. This is returned by simply
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7285 placing the symbol as the last element of the list starting with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7286 `let'. It gets evaluated after the preceding elements of the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7287 are evaluated, which means it gets evaluated after it has been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7288 assigned the correct value for the total.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7289
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7290 It may be easier to see this by printing the list starting with `let'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7291 all on one line. This format makes it evident that the VARLIST and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7292 `while' expressions are the second and third elements of the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7293 starting with `let', and the `total' is the last element:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7294
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7295 (let (VARLIST) (while (TRUE-OR-FALSE-TEST) BODY-OF-WHILE... ) total)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7296
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7297 Putting everything together, the `triangle' function definition looks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7298 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7299
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7300 (defun triangle (number-of-rows) ; Version with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7301 ; incrementing counter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7302 "Add up the number of pebbles in a triangle.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7303 The first row has one pebble, the second row two pebbles,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7304 the third row three pebbles, and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7305 The argument is NUMBER-OF-ROWS."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7306 (let ((total 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7307 (row-number 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7308 (while (<= row-number number-of-rows)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7309 (setq total (+ total row-number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7310 (setq row-number (1+ row-number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7311 total))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7312
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7313 After you have installed `triangle' by evaluating the function, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7314 can try it out. Here are two examples:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7315
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7316 (triangle 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7317
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7318 (triangle 7)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7319
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7320 The sum of the first four numbers is 10 and the sum of the first seven
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7321 numbers is 28.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7322
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7323 Loop with a Decrementing Counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7324 --------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7325
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7326 Another common way to write a `while' loop is to write the test so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7327 that it determines whether a counter is greater than zero. So long
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7328 as the counter is greater than zero, the loop is repeated. But when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7329 the counter is equal to or less than zero, the loop is stopped. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7330 this to work, the counter has to start out greater than zero and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7331 be made smaller and smaller by a form that is evaluated repeatedly.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7332
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7333 The test will be an expression such as `(> counter 0)' which returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7334 `t' for true if the value of `counter' is greater than zero, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7335 `nil' for false if the value of `counter' is equal to or less than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7336 zero. The expression that makes the number smaller and smaller can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7337 be a simple `setq' such as `(setq counter (1- counter))', where `1-'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7338 is a built-in function in Emacs Lisp that subtracts 1 from its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7339 argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7340
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7341 The template for a decrementing `while' loop looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7342
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7343 (while (> counter 0) ; true-or-false-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7344 BODY...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7345 (setq counter (1- counter))) ; decrementer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7346
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7347 Example with decrementing counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7348 .................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7349
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7350 To illustrate a loop with a decrementing counter, we will rewrite the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7351 `triangle' function so the counter decreases to zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7352
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7353 This is the reverse of the earlier version of the function. In this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7354 case, to find out how many pebbles are needed to make a triangle with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7355 3 rows, add the number of pebbles in the third row, 3, to the number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7356 in the preceding row, 2, and then add the total of those two rows to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7357 the row that precedes them, which is 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7358
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7359 Likewise, to find the number of pebbles in a triangle with 7 rows, add
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7360 the number of pebbles in the seventh row, 7, to the number in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7361 preceding row, which is 6, and then add the total of those two rows to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7362 the row that precedes them, which is 5, and so on. As in the previous
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7363 example, each addition only involves adding two numbers, the total of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7364 the rows already added up and the number of pebbles in the row that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7365 being added to the total. This process of adding two numbers is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7366 repeated again and again until there are no more pebbles to add.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7367
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7368 We know how many pebbles to start with: the number of pebbles in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7369 last row is equal to the number of rows. If the triangle has seven
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7370 rows, the number of pebbles in the last row is 7. Likewise, we know
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7371 how many pebbles are in the preceding row: it is one less than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7372 number in the row.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7373
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7374 The parts of the function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7375 ....................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7376
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7377 We start with three variables: the total number of rows in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7378 triangle; the number of pebbles in a row; and the total number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7379 pebbles, which is what we want to calculate. These variables can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7380 named `number-of-rows', `number-of-pebbles-in-row', and `total',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7381 respectively.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7382
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7383 Both `total' and `number-of-pebbles-in-row' are used only inside the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7384 function and are declared with `let'. The initial value of `total'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7385 should, of course, be zero. However, the initial value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7386 `number-of-pebbles-in-row' should be equal to the number of rows in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7387 the triangle, since the addition will start with the longest row.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7388
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7389 This means that the beginning of the `let' expression will look like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7390 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7391
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7392 (let ((total 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7393 (number-of-pebbles-in-row number-of-rows))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7394 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7395
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7396 The total number of pebbles can be found by repeatedly adding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7397 number of pebbles in a row to the total already found, that is, by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7398 repeatedly evaluating the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7399
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7400 (setq total (+ total number-of-pebbles-in-row))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7401
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7402 After the `number-of-pebbles-in-row' is added to the `total', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7403 `number-of-pebbles-in-row' should be decremented by one, since the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7404 next time the loop repeats, the preceding row will be added to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7405 total.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7406
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7407 The number of pebbles in a preceding row is one less than the number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7408 of pebbles in a row, so the built-in Emacs Lisp function `1-' can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7409 used to compute the number of pebbles in the preceding row. This can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7410 be done with the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7411
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7412 (setq number-of-pebbles-in-row
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7413 (1- number-of-pebbles-in-row))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7414
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7415 Finally, we know that the `while' loop should stop making repeated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7416 additions when there are no pebbles in a row. So the test for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7417 `while' loop is simply:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7418
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7419 (while (> number-of-pebbles-in-row 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7420
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7421 Putting the function definition together
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7422 ........................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7423
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7424 We can put these expressions together to create a function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7425 that works. However, on examination, we find that one of the local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7426 variables is unneeded!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7427
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7428 The function definition looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7429
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7430 ;;; First subtractive version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7431 (defun triangle (number-of-rows)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7432 "Add up the number of pebbles in a triangle."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7433 (let ((total 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7434 (number-of-pebbles-in-row number-of-rows))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7435 (while (> number-of-pebbles-in-row 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7436 (setq total (+ total number-of-pebbles-in-row))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7437 (setq number-of-pebbles-in-row
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7438 (1- number-of-pebbles-in-row)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7439 total))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7440
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7441 As written, this function works.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7442
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7443 However, we do not need `number-of-pebbles-in-row'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7444
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7445 When the `triangle' function is evaluated, the symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7446 `number-of-rows' will be bound to a number, giving it an initial
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7447 value. That number can be changed in the body of the function as if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7448 it were a local variable, without any fear that such a change will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7449 effect the value of the variable outside of the function. This is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7450 very useful characteristic of Lisp; it means that the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7451 `number-of-rows' can be used anywhere in the function where
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7452 `number-of-pebbles-in-row' is used.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7453
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7454 Here is a second version of the function written a bit more cleanly:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7455
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7456 (defun triangle (number) ; Second version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7457 "Return sum of numbers 1 through NUMBER inclusive."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7458 (let ((total 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7459 (while (> number 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7460 (setq total (+ total number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7461 (setq number (1- number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7462 total))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7463
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7464 In brief, a properly written `while' loop will consist of three parts:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7465
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7466 1. A test that will return false after the loop has repeated itself
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7467 the correct number of times.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7468
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7469 2. An expression the evaluation of which will return the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7470 desired after being repeatedly evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7471
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7472 3. An expression to change the value passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7473 true-or-false-test so that the test returns false after the loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7474 has repeated itself the right number of times.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7475
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7476 Save your time: `dolist' and `dotimes'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7477 ======================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7478
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7479 In addition to `while', both `dolist' and `dotimes' provide for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7480 looping. Sometimes these are quicker to write than the equivalent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7481 `while' loop. Both are Lisp macros. (*Note Macros: (elisp)Macros. )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7482
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7483 `dolist' works like a `while' loop that `CDRs down a list': `dolist'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7484 automatically shortens the list each time it loops--takes the CDR of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7485 the list--and binds the CAR of each shorter version of the list to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7486 the first of its arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7487
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7488 `dotimes' loops a specific number of times: you specify the number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7489
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7490 The `dolist' Macro
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7491 ..................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7492
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7493 Suppose, for example, you want to reverse a list, so that "first"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7494 "second" "third" becomes "third" "second" "first".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7495
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7496 In practice, you would use the `reverse' function, like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7497
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7498 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7499
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7500 (reverse animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7501
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7502 Here is how you could reverse the list using a `while' loop:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7504 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7505
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7506 (defun reverse-list-with-while (list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7507 "Using while, reverse the order of LIST."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7508 (let (value) ; make sure list starts empty
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7509 (while list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7510 (setq value (cons (car list) value))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7511 (setq list (cdr list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7512 value))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7513
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7514 (reverse-list-with-while animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7515
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7516 And here is how you could use the `dolist' macro:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7517
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7518 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7519
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7520 (defun reverse-list-with-dolist (list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7521 "Using dolist, reverse the order of LIST."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7522 (let (value) ; make sure list starts empty
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7523 (dolist (element list value)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7524 (setq value (cons element value)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7525
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7526 (reverse-list-with-dolist animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7527
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7528 In Info, you can place your cursor after the closing parenthesis of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7529 each expression and type `C-x C-e'; in each case, you should see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7530
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7531 (tiger lion giraffe gazelle)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7532
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7533 in the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7534
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7535 For this example, the existing `reverse' function is obviously best.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7536 The `while' loop is just like our first example (*note A `while' Loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7537 and a List: Loop Example.). The `while' first checks whether the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7538 list has elements; if so, it constructs a new list by adding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7539 first element of the list to the existing list (which in the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7540 iteration of the loop is `nil'). Since the second element is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7541 prepended in front of the first element, and the third element is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7542 prepended in front of the second element, the list is reversed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7544 In the expression using a `while' loop, the `(setq list (cdr list))'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7545 expression shortens the list, so the `while' loop eventually stops.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7546 In addition, it provides the `cons' expression with a new first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7547 element by creating a new and shorter list at each repetition of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7548 loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7549
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7550 The `dolist' expression does very much the same as the `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7551 expression, except that the `dolist' macro does some of the work you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7552 have to do when writing a `while' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7553
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7554 Like a `while' loop, a `dolist' loops. What is different is that it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7555 automatically shortens the list each time it loops -- it `CDRs down
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7556 the list' on its own -- and it automatically binds the CAR of each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7557 shorter version of the list to the first of its arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7558
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7559 In the example, the CAR of each shorter version of the list is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7560 referred to using the symbol `element', the list itself is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7561 `list', and the value returned is called `value'. The remainder of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7562 the `dolist' expression is the body.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7563
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7564 The `dolist' expression binds the CAR of each shorter version of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7565 list to `element' and then evaluates the body of the expression; and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7566 repeats the loop. The result is returned in `value'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7567
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7568 The `dotimes' Macro
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7569 ...................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7570
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7571 The `dotimes' macro is similar to `dolist', except that it loops a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7572 specific number of times.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7573
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7574 The first argument to `dotimes' is assigned the numbers 0, 1, 2 and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7575 so forth each time around the loop, and the value of the third
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7576 argument is returned. You need to provide the value of the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7577 argument, which is how many times the macro loops.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7578
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7579 For example, the following binds the numbers from 0 up to, but not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7580 including, the number 3 to the first argument, NUMBER, and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7581 constructs a list of the three numbers. (The first number is 0, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7582 second number is 1, and the third number is 2; this makes a total of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7583 three numbers in all, starting with zero as the first number.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7584
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7585 (let (value) ; otherwise a value is a void variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7586 (dotimes (number 3 value)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7587 (setq value (cons number value))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7588
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7589 => (2 1 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7590
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7591 `dotimes' returns `value', so the way to use `dotimes' is to operate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7592 on some expression NUMBER number of times and then return the result,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7593 either as a list or an atom.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7594
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7595 Here is an example of a `defun' that uses `dotimes' to add up the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7596 number of pebbles in a triangle.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7597
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7598 (defun triangle-using-dotimes (number-of-rows)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7599 "Using dotimes, add up the number of pebbles in a triangle."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7600 (let ((total 0)) ; otherwise a total is a void variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7601 (dotimes (number number-of-rows total)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7602 (setq total (+ total (1+ number))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7603
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7604 (triangle-using-dotimes 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7605
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7606 Recursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7607 =========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7608
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7609 A recursive function contains code that tells the Lisp interpreter to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7610 call a program that runs exactly like itself, but with slightly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7611 different arguments. The code runs exactly the same because it has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7612 the same name. However, even though the program has the same name, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7613 is not the same entity. It is different. In the jargon, it is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7614 different `instance'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7615
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7616 Eventually, if the program is written correctly, the `slightly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7617 different arguments' will become sufficiently different from the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7618 arguments that the final instance will stop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7619
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7620 Building Robots: Extending the Metaphor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7621 ---------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7622
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7623 It is sometimes helpful to think of a running program as a robot that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7624 does a job. In doing its job, a recursive function calls on a second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7625 robot to help it. The second robot is identical to the first in every
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7626 way, except that the second robot helps the first and has been passed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7627 different arguments than the first.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7628
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7629 In a recursive function, the second robot may call a third; and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7630 third may call a fourth, and so on. Each of these is a different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7631 entity; but all are clones.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7632
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7633 Since each robot has slightly different instructions--the arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7634 will differ from one robot to the next--the last robot should know
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7635 when to stop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7636
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7637 Let's expand on the metaphor in which a computer program is a robot.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7638
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7639 A function definition provides the blueprints for a robot. When you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7640 install a function definition, that is, when you evaluate a `defun'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7641 special form, you install the necessary equipment to build robots.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7642 It is as if you were in a factory, setting up an assembly line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7643 Robots with the same name are built according to the same blueprints.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7644 So they have, as it were, the same `model number', but a different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7645 `serial number'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7646
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7647 We often say that a recursive function `calls itself'. What we mean
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7648 is that the instructions in a recursive function cause the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7649 interpreter to run a different function that has the same name and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7650 does the same job as the first, but with different arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7651
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7652 It is important that the arguments differ from one instance to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7653 next; otherwise, the process will never stop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7654
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7655 The Parts of a Recursive Definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7656 -----------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7657
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7658 A recursive function typically contains a conditional expression which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7659 has three parts:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7660
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7661 1. A true-or-false-test that determines whether the function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7662 called again, here called the "do-again-test".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7663
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7664 2. The name of the function. When this name is called, a new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7665 instance of the function--a new robot, as it were--is created
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7666 and told what to do.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7667
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7668 3. An expression that returns a different value each time the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7669 function is called, here called the "next-step-expression".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7670 Consequently, the argument (or arguments) passed to the new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7671 instance of the function will be different from that passed to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7672 the previous instance. This causes the conditional expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7673 the "do-again-test", to test false after the correct number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7674 repetitions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7675
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7676 Recursive functions can be much simpler than any other kind of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7677 function. Indeed, when people first start to use them, they often
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7678 look so mysteriously simple as to be incomprehensible. Like riding a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7679 bicycle, reading a recursive function definition takes a certain knack
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7680 which is hard at first but then seems simple.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7681
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7682 There are several different common recursive patterns. A very simple
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7683 pattern looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7684
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7685 (defun NAME-OF-RECURSIVE-FUNCTION (ARGUMENT-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7686 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7687 (if DO-AGAIN-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7688 BODY...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7689 (NAME-OF-RECURSIVE-FUNCTION
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7690 NEXT-STEP-EXPRESSION)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7691
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7692 Each time a recursive function is evaluated, a new instance of it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7693 created and told what to do. The arguments tell the instance what to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7694 do.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7695
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7696 An argument is bound to the value of the next-step-expression. Each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7697 instance runs with a different value of the next-step-expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7698
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7699 The value in the next-step-expression is used in the do-again-test.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7700
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7701 The value returned by the next-step-expression is passed to the new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7702 instance of the function, which evaluates it (or some
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7703 transmogrification of it) to determine whether to continue or stop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7704 The next-step-expression is designed so that the do-again-test returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7705 false when the function should no longer be repeated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7706
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7707 The do-again-test is sometimes called the "stop condition", since it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7708 stops the repetitions when it tests false.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7709
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7710 Recursion with a List
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7711 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7712
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7713 The example of a `while' loop that printed the elements of a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7714 numbers can be written recursively. Here is the code, including an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7715 expression to set the value of the variable `animals' to a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7716
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7717 If you are using Emacs 20 or before, this example must be copied to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7718 the `*scratch*' buffer and each expression must be evaluated there.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7719 Use `C-u C-x C-e' to evaluate the `(print-elements-recursively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7720 animals)' expression so that the results are printed in the buffer;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7721 otherwise the Lisp interpreter will try to squeeze the results into
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7722 the one line of the echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7723
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7724 Also, place your cursor immediately after the last closing parenthesis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7725 of the `print-elements-recursively' function, before the comment.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7726 Otherwise, the Lisp interpreter will try to evaluate the comment.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7727
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7728 If you are using Emacs 21 or later, you can evaluate this expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7729 directly in Info.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7730
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7731 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7732
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7733 (defun print-elements-recursively (list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7734 "Print each element of LIST on a line of its own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7735 Uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7736 (if list ; do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7737 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7738 (print (car list)) ; body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7739 (print-elements-recursively ; recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7740 (cdr list))))) ; next-step-expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7741
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7742 (print-elements-recursively animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7743
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7744 The `print-elements-recursively' function first tests whether there
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7745 is any content in the list; if there is, the function prints the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7746 first element of the list, the CAR of the list. Then the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7747 `invokes itself', but gives itself as its argument, not the whole
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7748 list, but the second and subsequent elements of the list, the CDR of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7749 the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7750
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7751 Put another way, if the list is not empty, the function invokes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7752 another instance of code that is similar to the initial code, but is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7753 different thread of execution, with different arguments than the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7754 instance.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7755
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7756 Put in yet another way, if the list is not empty, the first robot
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7757 assemblies a second robot and tells it what to do; the second robot is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7758 a different individual from the first, but is the same model.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7759
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7760 When the second evaluation occurs, the `if' expression is evaluated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7761 and if true, prints the first element of the list it receives as its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7762 argument (which is the second element of the original list). Then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7763 the function `calls itself' with the CDR of the list it is invoked
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7764 with, which (the second time around) is the CDR of the CDR of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7765 original list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7766
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7767 Note that although we say that the function `calls itself', what we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7768 mean is that the Lisp interpreter assembles and instructs a new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7769 instance of the program. The new instance is a clone of the first,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7770 but is a separate individual.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7771
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7772 Each time the function `invokes itself', it invokes itself on a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7773 shorter version of the original list. It creates a new instance that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7774 works on a shorter list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7775
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7776 Eventually, the function invokes itself on an empty list. It creates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7777 a new instance whose argument is `nil'. The conditional expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7778 tests the value of `list'. Since the value of `list' is `nil', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7779 `if' expression tests false so the then-part is not evaluated. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7780 function as a whole then returns `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7782 When you evaluate `(print-elements-recursively animals)' in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7783 `*scratch*' buffer, you see this result:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7784
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7785 gazelle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7786
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7787 giraffe
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7788
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7789 lion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7790
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7791 tiger
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7792 nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7794 Recursion in Place of a Counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7795 -------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7797 The `triangle' function described in a previous section can also be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7798 written recursively. It looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7799
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7800 (defun triangle-recursively (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7801 "Return the sum of the numbers 1 through NUMBER inclusive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7802 Uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7803 (if (= number 1) ; do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7804 1 ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7805 (+ number ; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7806 (triangle-recursively ; recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7807 (1- number))))) ; next-step-expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7808
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7809 (triangle-recursively 7)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7810
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7811 You can install this function by evaluating it and then try it by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7812 evaluating `(triangle-recursively 7)'. (Remember to put your cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7813 immediately after the last parenthesis of the function definition,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7814 before the comment.) The function evaluates to 28.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7816 To understand how this function works, let's consider what happens in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7817 the various cases when the function is passed 1, 2, 3, or 4 as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7818 value of its argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7819
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7820 An argument of 1 or 2
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7821 .....................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7822
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7823 First, what happens if the value of the argument is 1?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7824
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7825 The function has an `if' expression after the documentation string.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7826 It tests whether the value of `number' is equal to 1; if so, Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7827 evaluates the then-part of the `if' expression, which returns the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7828 number 1 as the value of the function. (A triangle with one row has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7829 one pebble in it.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7830
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7831 Suppose, however, that the value of the argument is 2. In this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7832 Emacs evaluates the else-part of the `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7833
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7834 The else-part consists of an addition, the recursive call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7835 `triangle-recursively' and a decrementing action; and it looks like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7836 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7838 (+ number (triangle-recursively (1- number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7839
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7840 When Emacs evaluates this expression, the innermost expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7841 evaluated first; then the other parts in sequence. Here are the steps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7842 in detail:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7843
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7844 Step 1 Evaluate the innermost expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7845 The innermost expression is `(1- number)' so Emacs decrements the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7846 value of `number' from 2 to 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7847
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7848 Step 2 Evaluate the `triangle-recursively' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7849 The Lisp interpreter creates an individual instance of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7850 `triangle-recursively'. It does not matter that this function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7851 contained within itself. Emacs passes the result Step 1 as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7852 argument used by this instance of the `triangle-recursively'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7853 function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7854
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7855 In this case, Emacs evaluates `triangle-recursively' with an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7856 argument of 1. This means that this evaluation of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7857 `triangle-recursively' returns 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7858
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7859 Step 3 Evaluate the value of `number'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7860 The variable `number' is the second element of the list that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7861 starts with `+'; its value is 2.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7862
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7863 Step 4 Evaluate the `+' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7864 The `+' expression receives two arguments, the first from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7865 evaluation of `number' (Step 3) and the second from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7866 evaluation of `triangle-recursively' (Step 2).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7867
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7868 The result of the addition is the sum of 2 plus 1, and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7869 number 3 is returned, which is correct. A triangle with two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7870 rows has three pebbles in it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7871
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7872 An argument of 3 or 4
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7873 .....................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7874
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7875 Suppose that `triangle-recursively' is called with an argument of 3.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7876
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7877 Step 1 Evaluate the do-again-test.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7878 The `if' expression is evaluated first. This is the do-again
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7879 test and returns false, so the else-part of the `if' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7880 is evaluated. (Note that in this example, the do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7881 causes the function to call itself when it tests false, not when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7882 it tests true.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7883
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7884 Step 2 Evaluate the innermost expression of the else-part.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7885 The innermost expression of the else-part is evaluated, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7886 decrements 3 to 2. This is the next-step-expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7888 Step 3 Evaluate the `triangle-recursively' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7889 The number 2 is passed to the `triangle-recursively' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7890
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7891 We know what happens when Emacs evaluates `triangle-recursively'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7892 with an argument of 2. After going through the sequence of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7893 actions described earlier, it returns a value of 3. So that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7894 what will happen here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7895
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7896 Step 4 Evaluate the addition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7897 3 will be passed as an argument to the addition and will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7898 added to the number with which the function was called, which is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7899 3.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7900
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7901 The value returned by the function as a whole will be 6.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7902
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7903 Now that we know what will happen when `triangle-recursively' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7904 called with an argument of 3, it is evident what will happen if it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7905 called with an argument of 4:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7906
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7907 In the recursive call, the evaluation of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7908
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7909 (triangle-recursively (1- 4))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7910
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7911 will return the value of evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7912
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7913 (triangle-recursively 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7914
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7915 which is 6 and this value will be added to 4 by the addition in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7916 the third line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7917
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7918 The value returned by the function as a whole will be 10.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7919
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7920 Each time `triangle-recursively' is evaluated, it evaluates a version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7921 of itself--a different instance of itself--with a smaller argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7922 until the argument is small enough so that it does not evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7923 itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7924
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7925 Note that this particular design for a recursive function requires
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7926 that operations be deferred.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7928 Before `(triangle-recursively 7)' can calculate its answer, it must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7929 call `(triangle-recursively 6)'; and before `(triangle-recursively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7930 6)' can calculate its answer, it must call `(triangle-recursively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7931 5)'; and so on. That is to say, the calculation that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7932 `(triangle-recursively 7)' makes must be deferred until
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7933 `(triangle-recursively 6)' makes its calculation; and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7934 `(triangle-recursively 6)' must defer until `(triangle-recursively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7935 5)' completes; and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7936
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7937 If each of these instances of `triangle-recursively' are thought of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7938 as different robots, the first robot must wait for the second to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7939 complete its job, which must wait until the third completes, and so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7940 on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7941
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7942 There is a way around this kind of waiting, which we will discuss in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7943 *Note Recursion without Deferments: No Deferment.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7944
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7945 Recursion Example Using `cond'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7946 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7947
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7948 The version of `triangle-recursively' described earlier is written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7949 with the `if' special form. It can also be written using another
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7950 special form called `cond'. The name of the special form `cond' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7951 an abbreviation of the word `conditional'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7952
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7953 Although the `cond' special form is not used as often in the Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7954 Lisp sources as `if', it is used often enough to justify explaining
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7955 it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7956
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7957 The template for a `cond' expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7958
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7959 (cond
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7960 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7961
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7962 where the BODY is a series of lists.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7963
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7964 Written out more fully, the template looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7965
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7966 (cond
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7967 (FIRST-TRUE-OR-FALSE-TEST FIRST-CONSEQUENT)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7968 (SECOND-TRUE-OR-FALSE-TEST SECOND-CONSEQUENT)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7969 (THIRD-TRUE-OR-FALSE-TEST THIRD-CONSEQUENT)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7970 ...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7971
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7972 When the Lisp interpreter evaluates the `cond' expression, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7973 evaluates the first element (the CAR or true-or-false-test) of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7974 first expression in a series of expressions within the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7975 `cond'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7976
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7977 If the true-or-false-test returns `nil' the rest of that expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7978 the consequent, is skipped and the true-or-false-test of the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7979 expression is evaluated. When an expression is found whose
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7980 true-or-false-test returns a value that is not `nil', the consequent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7981 of that expression is evaluated. The consequent can be one or more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7982 expressions. If the consequent consists of more than one expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7983 the expressions are evaluated in sequence and the value of the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7984 one is returned. If the expression does not have a consequent, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7985 value of the true-or-false-test is returned.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7986
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7987 If none of the true-or-false-tests test true, the `cond' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7988 returns `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7989
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7990 Written using `cond', the `triangle' function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7991
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7992 (defun triangle-using-cond (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7993 (cond ((<= number 0) 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7994 ((= number 1) 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7995 ((> number 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7996 (+ number (triangle-using-cond (1- number))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7997
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7998 In this example, the `cond' returns 0 if the number is less than or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
7999 equal to 0, it returns 1 if the number is 1 and it evaluates `(+
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8000 number (triangle-using-cond (1- number)))' if the number is greater
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8001 than 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8002
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8003 Recursive Patterns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8004 ------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8006 Here are three common recursive patterns. Each involves a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8007 Recursion does not need to involve lists, but Lisp is designed for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8008 lists and this provides a sense of its primal capabilities.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8009
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8010 Recursive Pattern: _every_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8011 ..........................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8012
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8013 In the `every' recursive pattern, an action is performed on every
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8014 element of a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8015
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8016 The basic pattern is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8017
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8018 * If a list be empty, return `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8019
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8020 * Else, act on the beginning of the list (the CAR of the list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8021 - through a recursive call by the function on the rest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8022 (the CDR) of the list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8023
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8024 - and, optionally, combine the acted-on element, using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8025 `cons', with the results of acting on the rest.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8026
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8027 Here is example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8028
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8029 (defun square-each (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8030 "Square each of a NUMBERS LIST, recursively."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8031 (if (not numbers-list) ; do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8032 nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8033 (cons
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8034 (* (car numbers-list) (car numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8035 (square-each (cdr numbers-list))))) ; next-step-expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8036
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8037 (square-each '(1 2 3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8038 => (1 4 9)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8039
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8040 If `numbers-list' is empty, do nothing. But if it has content,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8041 construct a list combining the square of the first number in the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8042 with the result of the recursive call.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8044 (The example follows the pattern exactly: `nil' is returned if the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8045 numbers' list is empty. In practice, you would write the conditional
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8046 so it carries out the action when the numbers' list is not empty.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8047
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8048 The `print-elements-recursively' function (*note Recursion with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8049 List: Recursion with list.) is another example of an `every' pattern,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8050 except in this case, rather than bring the results together using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8051 `cons', we print each element of output.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8052
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8053 The `print-elements-recursively' function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8054
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8055 (setq animals '(gazelle giraffe lion tiger))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8056
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8057 (defun print-elements-recursively (list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8058 "Print each element of LIST on a line of its own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8059 Uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8060 (if list ; do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8061 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8062 (print (car list)) ; body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8063 (print-elements-recursively ; recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8064 (cdr list))))) ; next-step-expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8065
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8066 (print-elements-recursively animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8067
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8068 The pattern for `print-elements-recursively' is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8069
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8070 * If the list be empty, do nothing.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8072 * But if the list has at least one element,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8073 - act on the beginning of the list (the CAR of the list),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8074
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8075 - and make a recursive call on the rest (the CDR) of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8076 list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8077
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8078 Recursive Pattern: _accumulate_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8079 ...............................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8080
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8081 Another recursive pattern is called the `accumulate' pattern. In the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8082 `accumulate' recursive pattern, an action is performed on every
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8083 element of a list and the result of that action is accumulated with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8084 the results of performing the action on the other elements.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8085
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8086 This is very like the `every' pattern using `cons', except that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8087 `cons' is not used, but some other combiner.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8088
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8089 The pattern is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8090
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8091 * If a list be empty, return zero or some other constant.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8093 * Else, act on the beginning of the list (the CAR of the list),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8094 - and combine that acted-on element, using `+' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8095 some other combining function, with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8096
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8097 - a recursive call by the function on the rest (the CDR)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8098 of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8099
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8100 Here is an example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8101
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8102 (defun add-elements (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8103 "Add the elements of NUMBERS-LIST together."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8104 (if (not numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8105 0
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8106 (+ (car numbers-list) (add-elements (cdr numbers-list)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8107
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8108 (add-elements '(1 2 3 4))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8109 => 10
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8110
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8111 *Note Making a List of Files: Files List, for an example of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8112 accumulate pattern.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8113
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8114 Recursive Pattern: _keep_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8115 .........................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8116
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8117 A third recursive pattern is called the `keep' pattern. In the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8118 `keep' recursive pattern, each element of a list is tested; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8119 element is acted on and the results are kept only if the element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8120 meets a criterion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8121
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8122 Again, this is very like the `every' pattern, except the element is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8123 skipped unless it meets a criterion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8124
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8125 The pattern has three parts:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8126
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8127 * If a list be empty, return `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8128
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8129 * Else, if the beginning of the list (the CAR of the list) passes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8130 a test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8131 - act on that element and combine it, using `cons' with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8133 - a recursive call by the function on the rest (the CDR)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8134 of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8135
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8136 * Otherwise, if the beginning of the list (the CAR of the list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8137 fails the test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8138 - skip on that element,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8139
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8140 - and, recursively call the function on the rest (the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8141 CDR) of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8142
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8143 Here is an example that uses `cond':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8144
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8145 (defun keep-three-letter-words (word-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8146 "Keep three letter words in WORD-LIST."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8147 (cond
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8148 ;; First do-again-test: stop-condition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8149 ((not word-list) nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8150
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8151 ;; Second do-again-test: when to act
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8152 ((eq 3 (length (symbol-name (car word-list))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8153 ;; combine acted-on element with recursive call on shorter list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8154 (cons (car word-list) (keep-three-letter-words (cdr word-list))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8155
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8156 ;; Third do-again-test: when to skip element;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8157 ;; recursively call shorter list with next-step expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8158 (t (keep-three-letter-words (cdr word-list)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8159
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8160 (keep-three-letter-words '(one two three four five six))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8161 => (one two six)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8162
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8163 It goes without saying that you need not use `nil' as the test for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8164 when to stop; and you can, of course, combine these patterns.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8165
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8166 Recursion without Deferments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8167 ----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8168
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8169 Let's consider again what happens with the `triangle-recursively'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8170 function. We will find that the intermediate calculations are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8171 deferred until all can be done.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8172
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8173 Here is the function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8174
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8175 (defun triangle-recursively (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8176 "Return the sum of the numbers 1 through NUMBER inclusive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8177 Uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8178 (if (= number 1) ; do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8179 1 ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8180 (+ number ; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8181 (triangle-recursively ; recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8182 (1- number))))) ; next-step-expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8183
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8184 What happens when we call this function with a argument of 7?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8185
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8186 The first instance of the `triangle-recursively' function adds the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8187 number 7 to the value returned by a second instance of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8188 `triangle-recursively', an instance that has been passed an argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8189 of 6. That is to say, the first calculation is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8190
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8191 (+ 7 (triangle-recursively 6))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8192
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8193 The first instance of `triangle-recursively'--you may want to think
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8194 of it as a little robot--cannot complete its job. It must hand off
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8195 the calculation for `(triangle-recursively 6)' to a second instance
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8196 of the program, to a second robot. This second individual is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8197 completely different from the first one; it is, in the jargon, a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8198 `different instantiation'. Or, put another way, it is a different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8199 robot. It is the same model as the first; it calculates triangle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8200 numbers recursively; but it has a different serial number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8201
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8202 And what does `(triangle-recursively 6)' return? It returns the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8203 number 6 added to the value returned by evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8204 `triangle-recursively' with an argument of 5. Using the robot
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8205 metaphor, it asks yet another robot to help it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8206
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8207 Now the total is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8208
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8209 (+ 7 6 (triangle-recursively 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8210
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8211 And what happens next?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8213 (+ 7 6 5 (triangle-recursively 4))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8214
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8215 Each time `triangle-recursively' is called, except for the last time,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8216 it creates another instance of the program--another robot--and asks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8217 it to make a calculation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8218
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8219 Eventually, the full addition is set up and performed:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8220
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8221 (+ 7 6 5 4 3 2 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8223 This design for the function defers the calculation of the first step
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8224 until the second can be done, and defers that until the third can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8225 done, and so on. Each deferment means the computer must remember what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8226 is being waited on. This is not a problem when there are only a few
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8227 steps, as in this example. But it can be a problem when there are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8228 more steps.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8229
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8230 No Deferment Solution
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8231 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8232
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8233 The solution to the problem of deferred operations is to write in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8234 manner that does not defer operations(1). This requires writing to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8235 different pattern, often one that involves writing two function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8236 definitions, an `initialization' function and a `helper' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8237
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8238 The `initialization' function sets up the job; the `helper' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8239 does the work.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8241 Here are the two function definitions for adding up numbers. They are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8242 so simple, I find them hard to understand.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8243
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8244 (defun triangle-initialization (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8245 "Return the sum of the numbers 1 through NUMBER inclusive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8246 This is the `initialization' component of a two function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8247 duo that uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8248 (triangle-recursive-helper 0 0 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8249
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8250 (defun triangle-recursive-helper (sum counter number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8251 "Return SUM, using COUNTER, through NUMBER inclusive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8252 This is the `helper' component of a two function duo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8253 that uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8254 (if (> counter number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8255 sum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8256 (triangle-recursive-helper (+ sum counter) ; sum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8257 (1+ counter) ; counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8258 number))) ; number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8259
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8260 Install both function definitions by evaluating them, then call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8261 `triangle-initialization' with 2 rows:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8262
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8263 (triangle-initialization 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8264 => 3
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8265
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8266 The `initialization' function calls the first instance of the `helper'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8267 function with three arguments: zero, zero, and a number which is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8268 number of rows in the triangle.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8269
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8270 The first two arguments passed to the `helper' function are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8271 initialization values. These values are changed when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8272 `triangle-recursive-helper' invokes new instances.(2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8273
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8274 Let's see what happens when we have a triangle that has one row.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8275 (This triangle will have one pebble in it!)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8276
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8277 `triangle-initialization' will call its helper with the arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8278 `0 0 1'. That function will run the conditional test whether `(>
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8279 counter number)':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8280
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8281 (> 0 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8282
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8283 and find that the result is false, so it will invoke the then-part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8284 the `if' clause:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8285
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8286 (triangle-recursive-helper
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8287 (+ sum counter) ; sum plus counter => sum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8288 (1+ counter) ; increment counter => counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8289 number) ; number stays the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8290
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8291 which will first compute:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8293 (triangle-recursive-helper (+ 0 0) ; sum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8294 (1+ 0) ; counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8295 1) ; number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8296 which is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8297
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8298 (triangle-recursive-helper 0 1 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8299
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8300 Again, `(> counter number)' will be false, so again, the Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8301 interpreter will evaluate `triangle-recursive-helper', creating a new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8302 instance with new arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8303
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8304 This new instance will be;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8305
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8306 (triangle-recursive-helper
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8307 (+ sum counter) ; sum plus counter => sum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8308 (1+ counter) ; increment counter => counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8309 number) ; number stays the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8310
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8311 which is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8312
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8313 (triangle-recursive-helper 1 2 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8314
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8315 In this case, the `(> counter number)' test will be true! So the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8316 instance will return the value of the sum, which will be 1, as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8317 expected.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8318
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8319 Now, let's pass `triangle-initialization' an argument of 2, to find
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8320 out how many pebbles there are in a triangle with two rows.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8321
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8322 That function calls `(triangle-recursive-helper 0 0 2)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8323
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8324 In stages, the instances called will be:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8325
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8326 sum counter number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8327 (triangle-recursive-helper 0 1 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8329 (triangle-recursive-helper 1 2 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8331 (triangle-recursive-helper 3 3 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8332
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8333 When the last instance is called, the `(> counter number)' test will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8334 be true, so the instance will return the value of `sum', which will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8335 be 3.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8336
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8337 This kind of pattern helps when you are writing functions that can use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8338 many resources in a computer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8339
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8340 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8341
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8342 (1) The phrase "tail recursive" is used to describe such a process,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8343 one that uses `constant space'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8344
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8345 (2) The jargon is mildly confusing: `triangle-recursive-helper' uses
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8346 a process that is iterative in a procedure that is recursive. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8347 process is called iterative because the computer need only record the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8348 three values, `sum', `counter', and `number'; the procedure is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8349 recursive because the function `calls itself'. On the other hand,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8350 both the process and the procedure used by `triangle-recursively' are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8351 called recursive. The word `recursive' has different meanings in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8352 two contexts.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8353
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8354 Looping Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8355 ================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8356
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8357 * Write a function similar to `triangle' in which each row has a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8358 value which is the square of the row number. Use a `while' loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8359
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8360 * Write a function similar to `triangle' that multiplies instead of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8361 adds the values.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8362
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8363 * Rewrite these two functions recursively. Rewrite these functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8364 using `cond'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8365
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8366 * Write a function for Texinfo mode that creates an index entry at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8367 the beginning of a paragraph for every `@dfn' within the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8368 paragraph. (In a Texinfo file, `@dfn' marks a definition. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8369 more information, see *Note Indicating Definitions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8370 (texinfo)Indicating.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8371
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8372 Regular Expression Searches
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8373 ***************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8374
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8375 Regular expression searches are used extensively in GNU Emacs. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8376 two functions, `forward-sentence' and `forward-paragraph', illustrate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8377 these searches well. They use regular expressions to find where to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8378 move point. The phrase `regular expression' is often written as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8379 `regexp'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8380
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8381 Regular expression searches are described in *Note Regular Expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8382 Search: (emacs)Regexp Search, as well as in *Note Regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8383 Expressions: (elisp)Regular Expressions. In writing this chapter, I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8384 am presuming that you have at least a mild acquaintance with them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8385 The major point to remember is that regular expressions permit you to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8386 search for patterns as well as for literal strings of characters.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8387 For example, the code in `forward-sentence' searches for the pattern
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8388 of possible characters that could mark the end of a sentence, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8389 moves point to that spot.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8390
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8391 Before looking at the code for the `forward-sentence' function, it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8392 worth considering what the pattern that marks the end of a sentence
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8393 must be. The pattern is discussed in the next section; following that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8394 is a description of the regular expression search function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8395 `re-search-forward'. The `forward-sentence' function is described in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8396 the section following. Finally, the `forward-paragraph' function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8397 described in the last section of this chapter. `forward-paragraph'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8398 is a complex function that introduces several new features.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8399
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8400 The Regular Expression for `sentence-end'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8401 =========================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8402
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8403 The symbol `sentence-end' is bound to the pattern that marks the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8404 of a sentence. What should this regular expression be?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8405
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8406 Clearly, a sentence may be ended by a period, a question mark, or an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8407 exclamation mark. Indeed, only clauses that end with one of those
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8408 three characters should be considered the end of a sentence. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8409 means that the pattern should include the character set:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8410
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8411 [.?!]
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8412
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8413 However, we do not want `forward-sentence' merely to jump to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8414 period, a question mark, or an exclamation mark, because such a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8415 character might be used in the middle of a sentence. A period, for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8416 example, is used after abbreviations. So other information is needed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8417
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8418 According to convention, you type two spaces after every sentence, but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8419 only one space after a period, a question mark, or an exclamation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8420 mark in the body of a sentence. So a period, a question mark, or an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8421 exclamation mark followed by two spaces is a good indicator of an end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8422 of sentence. However, in a file, the two spaces may instead be a tab
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8423 or the end of a line. This means that the regular expression should
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8424 include these three items as alternatives.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8425
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8426 This group of alternatives will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8427
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8428 \\($\\| \\| \\)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8429 ^ ^^
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8430 TAB SPC
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8431
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8432 Here, `$' indicates the end of the line, and I have pointed out where
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8433 the tab and two spaces are inserted in the expression. Both are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8434 inserted by putting the actual characters into the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8435
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8436 Two backslashes, `\\', are required before the parentheses and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8437 vertical bars: the first backslash quotes the following backslash in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8438 Emacs; and the second indicates that the following character, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8439 parenthesis or the vertical bar, is special.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8440
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8441 Also, a sentence may be followed by one or more carriage returns, like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8442 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8443
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8444 [
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8445 ]*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8446
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8447 Like tabs and spaces, a carriage return is inserted into a regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8448 expression by inserting it literally. The asterisk indicates that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8449 <RET> is repeated zero or more times.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8450
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8451 But a sentence end does not consist only of a period, a question mark
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8452 or an exclamation mark followed by appropriate space: a closing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8453 quotation mark or a closing brace of some kind may precede the space.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8454 Indeed more than one such mark or brace may precede the space.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8455 These require a expression that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8456
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8457 []\"')}]*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8458
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8459 In this expression, the first `]' is the first character in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8460 expression; the second character is `"', which is preceded by a `\'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8461 to tell Emacs the `"' is _not_ special. The last three characters
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8462 are `'', `)', and `}'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8463
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8464 All this suggests what the regular expression pattern for matching the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8465 end of a sentence should be; and, indeed, if we evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8466 `sentence-end' we find that it returns the following value:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8467
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8468 sentence-end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8469 => "[.?!][]\"')}]*\\($\\| \\| \\)[
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8470 ]*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8471
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8472 The `re-search-forward' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8473 ================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8474
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8475 The `re-search-forward' function is very like the `search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8476 function. (*Note The `search-forward' Function: search-forward.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8477
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8478 `re-search-forward' searches for a regular expression. If the search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8479 is successful, it leaves point immediately after the last character
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8480 in the target. If the search is backwards, it leaves point just
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8481 before the first character in the target. You may tell
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8482 `re-search-forward' to return `t' for true. (Moving point is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8483 therefore a `side effect'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8484
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8485 Like `search-forward', the `re-search-forward' function takes four
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8486 arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8487
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8488 1. The first argument is the regular expression that the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8489 searches for. The regular expression will be a string between
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8490 quotations marks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8491
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8492 2. The optional second argument limits how far the function will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8493 search; it is a bound, which is specified as a position in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8494 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8495
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8496 3. The optional third argument specifies how the function responds
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8497 to failure: `nil' as the third argument causes the function to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8498 signal an error (and print a message) when the search fails; any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8499 other value causes it to return `nil' if the search fails and `t'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8500 if the search succeeds.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8501
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8502 4. The optional fourth argument is the repeat count. A negative
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8503 repeat count causes `re-search-forward' to search backwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8504
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8505 The template for `re-search-forward' looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8506
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8507 (re-search-forward "REGULAR-EXPRESSION"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8508 LIMIT-OF-SEARCH
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8509 WHAT-TO-DO-IF-SEARCH-FAILS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8510 REPEAT-COUNT)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8511
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8512 The second, third, and fourth arguments are optional. However, if you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8513 want to pass a value to either or both of the last two arguments, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8514 must also pass a value to all the preceding arguments. Otherwise, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8515 Lisp interpreter will mistake which argument you are passing the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8516 to.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8517
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8518 In the `forward-sentence' function, the regular expression will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8519 the value of the variable `sentence-end', namely:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8520
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8521 "[.?!][]\"')}]*\\($\\| \\| \\)[
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8522 ]*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8523
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8524 The limit of the search will be the end of the paragraph (since a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8525 sentence cannot go beyond a paragraph). If the search fails, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8526 function will return `nil'; and the repeat count will be provided by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8527 the argument to the `forward-sentence' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8528
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8529 `forward-sentence'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8530 ==================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8531
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8532 The command to move the cursor forward a sentence is a straightforward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8533 illustration of how to use regular expression searches in Emacs Lisp.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8534 Indeed, the function looks longer and more complicated than it is;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8535 this is because the function is designed to go backwards as well as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8536 forwards; and, optionally, over more than one sentence. The function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8537 is usually bound to the key command `M-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8538
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8539 Complete `forward-sentence' function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8540 -----------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8541
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8542 Here is the code for `forward-sentence':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8544 (defun forward-sentence (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8545 "Move forward to next sentence-end. With argument, repeat.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8546 With negative argument, move backward repeatedly to sentence-beginning.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8547 Sentence ends are identified by the value of sentence-end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8548 treated as a regular expression. Also, every paragraph boundary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8549 terminates sentences as well."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8550 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8551 (or arg (setq arg 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8552 (while (< arg 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8553 (let ((par-beg
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8554 (save-excursion (start-of-paragraph-text) (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8555 (if (re-search-backward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8556 (concat sentence-end "[^ \t\n]") par-beg t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8557 (goto-char (1- (match-end 0)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8558 (goto-char par-beg)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8559 (setq arg (1+ arg)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8560 (while (> arg 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8561 (let ((par-end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8562 (save-excursion (end-of-paragraph-text) (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8563 (if (re-search-forward sentence-end par-end t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8564 (skip-chars-backward " \t\n")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8565 (goto-char par-end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8566 (setq arg (1- arg))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8567
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8568 The function looks long at first sight and it is best to look at its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8569 skeleton first, and then its muscle. The way to see the skeleton is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8570 to look at the expressions that start in the left-most columns:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8571
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8572 (defun forward-sentence (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8573 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8574 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8575 (or arg (setq arg 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8576 (while (< arg 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8577 BODY-OF-WHILE-LOOP
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8578 (while (> arg 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8579 BODY-OF-WHILE-LOOP
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8580
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8581 This looks much simpler! The function definition consists of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8582 documentation, an `interactive' expression, an `or' expression, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8583 `while' loops.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8584
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8585 Let's look at each of these parts in turn.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8586
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8587 We note that the documentation is thorough and understandable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8588
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8589 The function has an `interactive "p"' declaration. This means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8590 the processed prefix argument, if any, is passed to the function as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8591 its argument. (This will be a number.) If the function is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8592 passed an argument (it is optional) then the argument `arg' will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8593 bound to 1. When `forward-sentence' is called non-interactively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8594 without an argument, `arg' is bound to `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8595
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8596 The `or' expression handles the prefix argument. What it does is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8597 either leave the value of `arg' as it is, but only if `arg' is bound
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8598 to a value; or it sets the value of `arg' to 1, in the case when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8599 `arg' is bound to `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8600
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8601 The `while' loops
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8602 -----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8603
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8604 Two `while' loops follow the `or' expression. The first `while' has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8605 a true-or-false-test that tests true if the prefix argument for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8606 `forward-sentence' is a negative number. This is for going
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8607 backwards. The body of this loop is similar to the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8608 second `while' clause, but it is not exactly the same. We will skip
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8609 this `while' loop and concentrate on the second `while' loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8610
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8611 The second `while' loop is for moving point forward. Its skeleton
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8612 looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8613
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8614 (while (> arg 0) ; true-or-false-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8615 (let VARLIST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8616 (if (TRUE-OR-FALSE-TEST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8617 THEN-PART
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8618 ELSE-PART
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8619 (setq arg (1- arg)))) ; `while' loop decrementer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8620
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8621 The `while' loop is of the decrementing kind. (*Note A Loop with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8622 Decrementing Counter: Decrementing Loop.) It has a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8623 true-or-false-test that tests true so long as the counter (in this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8624 case, the variable `arg') is greater than zero; and it has a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8625 decrementer that subtracts 1 from the value of the counter every time
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8626 the loop repeats.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8627
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8628 If no prefix argument is given to `forward-sentence', which is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8629 most common way the command is used, this `while' loop will run once,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8630 since the value of `arg' will be 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8631
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8632 The body of the `while' loop consists of a `let' expression, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8633 creates and binds a local variable, and has, as its body, an `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8634 expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8635
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8636 The body of the `while' loop looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8637
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8638 (let ((par-end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8639 (save-excursion (end-of-paragraph-text) (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8640 (if (re-search-forward sentence-end par-end t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8641 (skip-chars-backward " \t\n")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8642 (goto-char par-end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8643
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8644 The `let' expression creates and binds the local variable `par-end'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8645 As we shall see, this local variable is designed to provide a bound
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8646 or limit to the regular expression search. If the search fails to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8647 find a proper sentence ending in the paragraph, it will stop on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8648 reaching the end of the paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8649
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8650 But first, let us examine how `par-end' is bound to the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8651 end of the paragraph. What happens is that the `let' sets the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8652 of `par-end' to the value returned when the Lisp interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8653 evaluates the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8654
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8655 (save-excursion (end-of-paragraph-text) (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8656
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8657 In this expression, `(end-of-paragraph-text)' moves point to the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8658 of the paragraph, `(point)' returns the value of point, and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8659 `save-excursion' restores point to its original position. Thus, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8660 `let' binds `par-end' to the value returned by the `save-excursion'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8661 expression, which is the position of the end of the paragraph. (The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8662 `(end-of-paragraph-text)' function uses `forward-paragraph', which we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8663 will discuss shortly.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8664
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8665 Emacs next evaluates the body of the `let', which is an `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8666 expression that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8667
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8668 (if (re-search-forward sentence-end par-end t) ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8669 (skip-chars-backward " \t\n") ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8670 (goto-char par-end))) ; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8671
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8672 The `if' tests whether its first argument is true and if so,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8673 evaluates its then-part; otherwise, the Emacs Lisp interpreter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8674 evaluates the else-part. The true-or-false-test of the `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8675 expression is the regular expression search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8676
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8677 It may seem odd to have what looks like the `real work' of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8678 `forward-sentence' function buried here, but this is a common way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8679 this kind of operation is carried out in Lisp.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8680
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8681 The regular expression search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8682 -----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8683
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8684 The `re-search-forward' function searches for the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8685 sentence, that is, for the pattern defined by the `sentence-end'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8686 regular expression. If the pattern is found--if the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8687 sentence is found--then the `re-search-forward' function does two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8688 things:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8689
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8690 1. The `re-search-forward' function carries out a side effect, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8691 is to move point to the end of the occurrence found.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8692
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8693 2. The `re-search-forward' function returns a value of true. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8694 is the value received by the `if', and means that the search was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8695 successful.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8696
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8697 The side effect, the movement of point, is completed before the `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8698 function is handed the value returned by the successful conclusion of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8699 the search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8700
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8701 When the `if' function receives the value of true from a successful
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8702 call to `re-search-forward', the `if' evaluates the then-part, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8703 is the expression `(skip-chars-backward " \t\n")'. This expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8704 moves backwards over any blank spaces, tabs or carriage returns until
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8705 a printed character is found and then leaves point after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8706 character. Since point has already been moved to the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8707 pattern that marks the end of the sentence, this action leaves point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8708 right after the closing printed character of the sentence, which is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8709 usually a period.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8710
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8711 On the other hand, if the `re-search-forward' function fails to find
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8712 a pattern marking the end of the sentence, the function returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8713 false. The false then causes the `if' to evaluate its third
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8714 argument, which is `(goto-char par-end)': it moves point to the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8715 of the paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8716
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8717 Regular expression searches are exceptionally useful and the pattern
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8718 illustrated by `re-search-forward', in which the search is the test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8719 of an `if' expression, is handy. You will see or write code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8720 incorporating this pattern often.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8721
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8722 `forward-paragraph': a Goldmine of Functions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8723 ============================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8724
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8725 The `forward-paragraph' function moves point forward to the end of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8726 the paragraph. It is usually bound to `M-}' and makes use of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8727 number of functions that are important in themselves, including
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8728 `let*', `match-beginning', and `looking-at'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8729
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8730 The function definition for `forward-paragraph' is considerably
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8731 longer than the function definition for `forward-sentence' because it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8732 works with a paragraph, each line of which may begin with a fill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8733 prefix.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8734
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8735 A fill prefix consists of a string of characters that are repeated at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8736 the beginning of each line. For example, in Lisp code, it is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8737 convention to start each line of a paragraph-long comment with `;;;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8738 '. In Text mode, four blank spaces make up another common fill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8739 prefix, creating an indented paragraph. (*Note Fill Prefix:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8740 (emacs)Fill Prefix, for more information about fill prefixes.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8741
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8742 The existence of a fill prefix means that in addition to being able to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8743 find the end of a paragraph whose lines begin on the left-most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8744 column, the `forward-paragraph' function must be able to find the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8745 of a paragraph when all or many of the lines in the buffer begin with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8746 the fill prefix.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8747
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8748 Moreover, it is sometimes practical to ignore a fill prefix that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8749 exists, especially when blank lines separate paragraphs. This is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8750 added complication.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8751
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8752 Shortened `forward-paragraph' function definition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8753 -------------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8754
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8755 Rather than print all of the `forward-paragraph' function, we will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8756 only print parts of it. Read without preparation, the function can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8757 be daunting!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8758
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8759 In outline, the function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8760
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8761 (defun forward-paragraph (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8762 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8763 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8764 (or arg (setq arg 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8765 (let*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8766 VARLIST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8767 (while (< arg 0) ; backward-moving-code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8768 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8769 (setq arg (1+ arg)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8770 (while (> arg 0) ; forward-moving-code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8771 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8772 (setq arg (1- arg)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8774 The first parts of the function are routine: the function's argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8775 list consists of one optional argument. Documentation follows.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8776
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8777 The lower case `p' in the `interactive' declaration means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8778 processed prefix argument, if any, is passed to the function. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8779 will be a number, and is the repeat count of how many paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8780 point will move. The `or' expression in the next line handles the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8781 common case when no argument is passed to the function, which occurs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8782 if the function is called from other code rather than interactively.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8783 This case was described earlier. (*Note The `forward-sentence'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8784 function: forward-sentence.) Now we reach the end of the familiar
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8785 part of this function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8786
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8787 The `let*' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8788 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8789
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8790 The next line of the `forward-paragraph' function begins a `let*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8791 expression. This is a different kind of expression than we have seen
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8792 so far. The symbol is `let*' not `let'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8794 The `let*' special form is like `let' except that Emacs sets each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8795 variable in sequence, one after another, and variables in the latter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8796 part of the varlist can make use of the values to which Emacs set
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8797 variables in the earlier part of the varlist.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8798
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8799 In the `let*' expression in this function, Emacs binds two variables:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8800 `fill-prefix-regexp' and `paragraph-separate'. The value to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8801 `paragraph-separate' is bound depends on the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8802 `fill-prefix-regexp'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8803
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8804 Let's look at each in turn. The symbol `fill-prefix-regexp' is set
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8805 to the value returned by evaluating the following list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8806
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8807 (and fill-prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8808 (not (equal fill-prefix ""))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8809 (not paragraph-ignore-fill-prefix)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8810 (regexp-quote fill-prefix))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8811
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8812 This is an expression whose first element is the `and' special form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8813
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8814 As we learned earlier (*note The `kill-new' function: kill-new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8815 function.), the `and' special form evaluates each of its arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8816 until one of the arguments returns a value of `nil', in which case
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8817 the `and' expression returns `nil'; however, if none of the arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8818 returns a value of `nil', the value resulting from evaluating the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8819 last argument is returned. (Since such a value is not `nil', it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8820 considered true in Lisp.) In other words, an `and' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8821 returns a true value only if all its arguments are true.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8822
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8823 In this case, the variable `fill-prefix-regexp' is bound to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8824 non-`nil' value only if the following four expressions produce a true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8825 (i.e., a non-`nil') value when they are evaluated; otherwise,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8826 `fill-prefix-regexp' is bound to `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8827
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8828 `fill-prefix'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8829 When this variable is evaluated, the value of the fill prefix,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8830 if any, is returned. If there is no fill prefix, this variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8831 returns `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8832
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8833 `(not (equal fill-prefix "")'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8834 This expression checks whether an existing fill prefix is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8835 empty string, that is, a string with no characters in it. An
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8836 empty string is not a useful fill prefix.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8838 `(not paragraph-ignore-fill-prefix)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8839 This expression returns `nil' if the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8840 `paragraph-ignore-fill-prefix' has been turned on by being set
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8841 to a true value such as `t'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8842
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8843 `(regexp-quote fill-prefix)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8844 This is the last argument to the `and' special form. If all the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8845 arguments to the `and' are true, the value resulting from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8846 evaluating this expression will be returned by the `and'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8847 expression and bound to the variable `fill-prefix-regexp',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8848
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8849 The result of evaluating this `and' expression successfully is that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8850 `fill-prefix-regexp' will be bound to the value of `fill-prefix' as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8851 modified by the `regexp-quote' function. What `regexp-quote' does is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8852 read a string and return a regular expression that will exactly match
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8853 the string and match nothing else. This means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8854 `fill-prefix-regexp' will be set to a value that will exactly match
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8855 the fill prefix if the fill prefix exists. Otherwise, the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8856 will be set to `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8857
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8858 The second local variable in the `let*' expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8859 `paragraph-separate'. It is bound to the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8860 evaluating the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8861
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8862 (if fill-prefix-regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8863 (concat paragraph-separate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8864 "\\|^" fill-prefix-regexp "[ \t]*$")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8865 paragraph-separate)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8866
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8867 This expression shows why `let*' rather than `let' was used. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8868 true-or-false-test for the `if' depends on whether the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8869 `fill-prefix-regexp' evaluates to `nil' or some other value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8870
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8871 If `fill-prefix-regexp' does not have a value, Emacs evaluates the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8872 else-part of the `if' expression and binds `paragraph-separate' to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8873 its local value. (`paragraph-separate' is a regular expression that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8874 matches what separates paragraphs.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8875
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8876 But if `fill-prefix-regexp' does have a value, Emacs evaluates the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8877 then-part of the `if' expression and binds `paragraph-separate' to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8878 regular expression that includes the `fill-prefix-regexp' as part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8879 the pattern.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8880
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8881 Specifically, `paragraph-separate' is set to the original value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8882 the paragraph separate regular expression concatenated with an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8883 alternative expression that consists of the `fill-prefix-regexp'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8884 followed by a blank line. The `^' indicates that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8885 `fill-prefix-regexp' must begin a line, and the optional whitespace
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8886 to the end of the line is defined by `"[ \t]*$"'.) The `\\|' defines
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8887 this portion of the regexp as an alternative to `paragraph-separate'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8888
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8889 Now we get into the body of the `let*'. The first part of the body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8890 of the `let*' deals with the case when the function is given a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8891 negative argument and is therefore moving backwards. We will skip
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8892 this section.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8893
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8894 The forward motion `while' loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8895 -------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8896
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8897 The second part of the body of the `let*' deals with forward motion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8898 It is a `while' loop that repeats itself so long as the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8899 `arg' is greater than zero. In the most common use of the function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8900 the value of the argument is 1, so the body of the `while' loop is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8901 evaluated exactly once, and the cursor moves forward one paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8902
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8903 This part handles three situations: when point is between paragraphs,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8904 when point is within a paragraph and there is a fill prefix, and when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8905 point is within a paragraph and there is no fill prefix.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8906
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8907 The `while' loop looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8908
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8909 (while (> arg 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8910 (beginning-of-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8911
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8912 ;; between paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8913 (while (prog1 (and (not (eobp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8914 (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8915 (forward-line 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8916
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8917 ;; within paragraphs, with a fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8918 (if fill-prefix-regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8919 ;; There is a fill prefix; it overrides paragraph-start.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8920 (while (and (not (eobp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8921 (not (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8922 (looking-at fill-prefix-regexp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8923 (forward-line 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8924
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8925 ;; within paragraphs, no fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8926 (if (re-search-forward paragraph-start nil t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8927 (goto-char (match-beginning 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8928 (goto-char (point-max))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8929
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8930 (setq arg (1- arg)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8931
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8932 We can see immediately that this is a decrementing counter `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8933 loop, using the expression `(setq arg (1- arg))' as the decrementer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8934
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8935 The body of the loop consists of three expressions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8936
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8937 ;; between paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8938 (beginning-of-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8939 (while
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8940 BODY-OF-WHILE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8941
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8942 ;; within paragraphs, with fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8943 (if TRUE-OR-FALSE-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8944 THEN-PART
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8945
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8946 ;; within paragraphs, no fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8947 ELSE-PART
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8948
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8949 When the Emacs Lisp interpreter evaluates the body of the `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8950 loop, the first thing it does is evaluate the `(beginning-of-line)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8951 expression and move point to the beginning of the line. Then there
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8952 is an inner `while' loop. This `while' loop is designed to move the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8953 cursor out of the blank space between paragraphs, if it should happen
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8954 to be there. Finally, there is an `if' expression that actually
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8955 moves point to the end of the paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8956
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8957 Between paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8958 ------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8959
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8960 First, let us look at the inner `while' loop. This loop handles the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8961 case when point is between paragraphs; it uses three functions that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8962 are new to us: `prog1', `eobp' and `looking-at'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8963
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8964 * `prog1' is similar to the `progn' special form, except that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8965 `prog1' evaluates its arguments in sequence and then returns the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8966 value of its first argument as the value of the whole
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8967 expression. (`progn' returns the value of its last argument as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8968 the value of the expression.) The second and subsequent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8969 arguments to `prog1' are evaluated only for their side effects.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8970
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8971 * `eobp' is an abbreviation of `End Of Buffer P' and is a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8972 that returns true if point is at the end of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8973
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8974 * `looking-at' is a function that returns true if the text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8975 following point matches the regular expression passed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8976 `looking-at' as its argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8977
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8978 The `while' loop we are studying looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8979
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8980 (while (prog1 (and (not (eobp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8981 (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8982 (forward-line 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8983
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8984 This is a `while' loop with no body! The true-or-false-test of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8985 loop is the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8986
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8987 (prog1 (and (not (eobp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8988 (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8989 (forward-line 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8990
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8991 The first argument to the `prog1' is the `and' expression. It has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8992 within in it a test of whether point is at the end of the buffer and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8993 also a test of whether the pattern following point matches the regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8994 expression for separating paragraphs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8995
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8996 If the cursor is not at the end of the buffer and if the characters
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8997 following the cursor mark the separation between two paragraphs, then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8998 the `and' expression is true. After evaluating the `and' expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
8999 the Lisp interpreter evaluates the second argument to `prog1', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9000 is `forward-line'. This moves point forward one line. The value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9001 returned by the `prog1' however, is the value of its first argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9002 so the `while' loop continues so long as point is not at the end of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9003 the buffer and is between paragraphs. When, finally, point is moved
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9004 to a paragraph, the `and' expression tests false. Note however, that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9005 the `forward-line' command is carried out anyhow. This means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9006 when point is moved from between paragraphs to a paragraph, it is left
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9007 at the beginning of the second line of the paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9008
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9009 Within paragraphs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9010 -----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9011
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9012 The next expression in the outer `while' loop is an `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9013 The Lisp interpreter evaluates the then-part of the `if' when the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9014 `fill-prefix-regexp' variable has a value other than `nil', and it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9015 evaluates the else-part when the value of `if fill-prefix-regexp' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9016 `nil', that is, when there is no fill prefix.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9017
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9018 No fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9019 --------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9020
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9021 It is simplest to look at the code for the case when there is no fill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9022 prefix first. This code consists of yet another inner `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9023 expression, and reads as follows:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9024
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9025 (if (re-search-forward paragraph-start nil t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9026 (goto-char (match-beginning 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9027 (goto-char (point-max)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9028
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9029 This expression actually does the work that most people think of as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9030 the primary purpose of the `forward-paragraph' command: it causes a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9031 regular expression search to occur that searches forward to the start
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9032 of the next paragraph and if it is found, moves point there; but if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9033 the start of another paragraph if not found, it moves point to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9034 end of the accessible region of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9035
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9036 The only unfamiliar part of this is the use of `match-beginning'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9037 This is another function that is new to us. The `match-beginning'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9038 function returns a number specifying the location of the start of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9039 text that was matched by the last regular expression search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9040
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9041 The `match-beginning' function is used here because of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9042 characteristic of a forward search: a successful forward search,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9043 regardless of whether it is a plain search or a regular expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9044 search, will move point to the end of the text that is found. In this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9045 case, a successful search will move point to the end of the pattern
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9046 for `paragraph-start', which will be the beginning of the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9047 paragraph rather than the end of the current one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9048
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9049 However, we want to put point at the end of the current paragraph,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9050 not at the beginning of the next one. The two positions may be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9051 different, because there may be several blank lines between
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9052 paragraphs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9053
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9054 When given an argument of 0, `match-beginning' returns the position
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9055 that is the start of the text that the most recent regular expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9056 search matched. In this case, the most recent regular expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9057 search is the one looking for `paragraph-start', so `match-beginning'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9058 returns the beginning position of the pattern, rather than the end of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9059 the pattern. The beginning position is the end of the paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9060
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9061 (Incidentally, when passed a positive number as an argument, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9062 `match-beginning' function will place point at that parenthesized
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9063 expression in the last regular expression. It is a useful function.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9064
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9065 With a fill prefix
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9066 ------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9067
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9068 The inner `if' expression just discussed is the else-part of an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9069 enclosing `if' expression which tests whether there is a fill prefix.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9070 If there is a fill prefix, the then-part of this `if' is evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9071 It looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9072
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9073 (while (and (not (eobp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9074 (not (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9075 (looking-at fill-prefix-regexp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9076 (forward-line 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9077
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9078 What this expression does is move point forward line by line so long
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9079 as three conditions are true:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9080
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9081 1. Point is not at the end of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9082
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9083 2. The text following point does not separate paragraphs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9084
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9085 3. The pattern following point is the fill prefix regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9086 expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9087
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9088 The last condition may be puzzling, until you remember that point was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9089 moved to the beginning of the line early in the `forward-paragraph'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9090 function. This means that if the text has a fill prefix, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9091 `looking-at' function will see it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9093 Summary
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9094 -------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9095
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9096 In summary, when moving forward, the `forward-paragraph' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9097 does the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9098
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9099 * Move point to the beginning of the line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9101 * Skip over lines between paragraphs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9102
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9103 * Check whether there is a fill prefix, and if there is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9104
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9105 -- Go forward line by line so long as the line is not a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9106 paragraph separating line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9107
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9108 * But if there is no fill prefix,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9109
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9110 -- Search for the next paragraph start pattern.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9112 -- Go to the beginning of the paragraph start pattern, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9113 will be the end of the previous paragraph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9114
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9115 -- Or else go to the end of the accessible portion of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9116 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9117
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9118 For review, here is the code we have just been discussing, formatted
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9119 for clarity:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9121 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9122 (or arg (setq arg 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9123 (let* (
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9124 (fill-prefix-regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9125 (and fill-prefix (not (equal fill-prefix ""))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9126 (not paragraph-ignore-fill-prefix)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9127 (regexp-quote fill-prefix)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9128
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9129 (paragraph-separate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9130 (if fill-prefix-regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9131 (concat paragraph-separate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9132 "\\|^"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9133 fill-prefix-regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9134 "[ \t]*$")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9135 paragraph-separate)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9136
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9137 OMITTED-BACKWARD-MOVING-CODE ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9138
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9139 (while (> arg 0) ; forward-moving-code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9140 (beginning-of-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9141
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9142 (while (prog1 (and (not (eobp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9143 (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9144 (forward-line 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9145
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9146 (if fill-prefix-regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9147 (while (and (not (eobp)) ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9148 (not (looking-at paragraph-separate))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9149 (looking-at fill-prefix-regexp))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9150 (forward-line 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9151 ; else-part: the inner-if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9152 (if (re-search-forward paragraph-start nil t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9153 (goto-char (match-beginning 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9154 (goto-char (point-max))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9155
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9156 (setq arg (1- arg))))) ; decrementer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9157
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9158 The full definition for the `forward-paragraph' function not only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9159 includes this code for going forwards, but also code for going
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9160 backwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9162 If you are reading this inside of GNU Emacs and you want to see the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9163 whole function, you can type `C-h f' (`describe-function') and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9164 name of the function. This gives you the function documentation and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9165 the name of the library containing the function's source. Place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9166 point over the name of the library and press the RET key; you will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9167 taken directly to the source. (Be sure to install your sources!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9168 Without them, you are like a person who tries to drive a car with his
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9169 eyes shut!)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9170
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9171 Or - a good habit to get into - you can type `M-.' (`find-tag') and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9172 the name of the function when prompted for it. This will take you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9173 directly to the source. If the `find-tag' function first asks you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9174 for the name of a `TAGS' table, give it the name of the `TAGS' file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9175 such as `/usr/local/share/emacs/21.0.100/lisp/TAGS'. (The exact path
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9176 to your `TAGS' file depends on how your copy of Emacs was installed.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9177
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9178 You can also create your own `TAGS' file for directories that lack
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9179 one. *Note Create Your Own `TAGS' File: etags.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9180
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9181 Create Your Own `TAGS' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9182 ===========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9183
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9184 The `M-.' (`find-tag') command takes you directly to the source for a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9185 function, variable, node, or other source. The function depends on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9186 tags tables to tell it where to go.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9187
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9188 You often need to build and install tags tables yourself. They are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9189 not built automatically. A tags table is called a `TAGS' file; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9190 name is in upper case letters.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9191
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9192 You can create a `TAGS' file by calling the `etags' program that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9193 comes as a part of the Emacs distribution. Usually, `etags' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9194 compiled and installed when Emacs is built. (`etags' is not an Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9195 Lisp function or a part of Emacs; it is a C program.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9197 To create a `TAGS' file, first switch to the directory in which you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9198 want to create the file. In Emacs you can do this with the `M-x cd'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9199 command, or by visiting a file in the directory, or by listing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9200 directory with `C-x d' (`dired'). Then run the compile command, with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9201 `etags *.el' as the command to execute
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9202
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9203 M-x compile RET etags *.el RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9204
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9205 to create a `TAGS' file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9206
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9207 For example, if you have a large number of files in your `~/emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9208 directory, as I do--I have 137 `.el' files in it, of which I load
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9209 12--you can create a `TAGS' file for the Emacs Lisp files in that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9210 directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9211
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9212 The `etags' program takes all the usual shell `wildcards'. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9213 example, if you have two directories for which you want a single
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9214 `TAGS file', type `etags *.el ../elisp/*.el', where `../elisp/' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9215 the second directory:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9216
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9217 M-x compile RET etags *.el ../elisp/*.el RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9218
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9219 Type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9220
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9221 M-x compile RET etags --help RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9223 to see a list of the options accepted by `etags' as well as a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9224 supported languages.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9226 The `etags' program handles more than 20 languages, including Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9227 Lisp, Common Lisp, Scheme, C, C++, Ada, Fortran, Java, LaTeX, Pascal,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9228 Perl, Python, Texinfo, makefiles, and most assemblers. The program
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9229 has no switches for specifying the language; it recognizes the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9230 language in an input file according to its file name and contents.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9231
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9232 `etags' is very helpful when you are writing code yourself and want
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9233 to refer back to functions you have already written. Just run
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9234 `etags' again at intervals as you write new functions, so they become
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9235 part of the `TAGS' file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9236
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9237 If you think an appropriate `TAGS' file already exists for what you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9238 want, but do not know where it is, you can use the `locate' program
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9239 to attempt to find it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9241 Type `M-x locate RET TAGS RET' and Emacs will list for you the full
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9242 path names of all your `TAGS' files. On my system, this command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9243 lists 34 `TAGS' files. On the other hand, a `plain vanilla' system I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9244 recently installed did not contain any `TAGS' files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9245
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9246 If the tags table you want has been created, you can use the `M-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9247 visit-tags-table' command to specify it. Otherwise, you will need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9248 create the tag table yourself and then use `M-x visit-tags-table'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9249
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9250 Building Tags in the Emacs sources
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9251 ..................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9252
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9253 The GNU Emacs sources come with a `Makefile' that contains a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9254 sophisticated `etags' command that creates, collects, and merges tags
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9255 tables from all over the Emacs sources and puts the information into
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9256 one `TAGS' file in the `src/' directory below the top level of your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9257 Emacs source directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9258
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9259 To build this `TAGS' file, go to the top level of your Emacs source
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9260 directory and run the compile command `make tags':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9261
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9262 M-x compile RET make tags RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9263
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9264 (The `make tags' command works well with the GNU Emacs sources, as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9265 well as with some other source packages.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9266
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9267 For more information, see *Note Tag Tables: (emacs)Tags.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9268
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9269 Review
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9270 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9271
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9272 Here is a brief summary of some recently introduced functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9273
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9274 `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9275 Repeatedly evaluate the body of the expression so long as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9276 first element of the body tests true. Then return `nil'. (The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9277 expression is evaluated only for its side effects.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9278
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9279 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9280
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9281 (let ((foo 2))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9282 (while (> foo 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9283 (insert (format "foo is %d.\n" foo))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9284 (setq foo (1- foo))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9285
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9286 => foo is 2.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9287 foo is 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9288 nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9289
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9290 (The `insert' function inserts its arguments at point; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9291 `format' function returns a string formatted from its arguments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9292 the way `message' formats its arguments; `\n' produces a new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9293 line.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9294
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9295 `re-search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9296 Search for a pattern, and if the pattern is found, move point to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9297 rest just after it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9298
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9299 Takes four arguments, like `search-forward':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9300
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9301 1. A regular expression that specifies the pattern to search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9302 for.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9303
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9304 2. Optionally, the limit of the search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9305
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9306 3. Optionally, what to do if the search fails, return `nil' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9307 an error message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9308
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9309 4. Optionally, how many times to repeat the search; if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9310 negative, the search goes backwards.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9311
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9312 `let*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9313 Bind some variables locally to particular values, and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9314 evaluate the remaining arguments, returning the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9315 last one. While binding the local variables, use the local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9316 values of variables bound earlier, if any.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9317
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9318 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9319
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9320 (let* ((foo 7)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9321 (bar (* 3 foo)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9322 (message "`bar' is %d." bar))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9323 => `bar' is 21.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9324
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9325 `match-beginning'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9326 Return the position of the start of the text found by the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9327 regular expression search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9329 `looking-at'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9330 Return `t' for true if the text after point matches the argument,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9331 which should be a regular expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9332
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9333 `eobp'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9334 Return `t' for true if point is at the end of the accessible part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9335 of a buffer. The end of the accessible part is the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9336 buffer if the buffer is not narrowed; it is the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9337 narrowed part if the buffer is narrowed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9338
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9339 `prog1'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9340 Evaluate each argument in sequence and then return the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9341 the _first_.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9342
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9343 For example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9344
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9345 (prog1 1 2 3 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9346 => 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9347
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9348 Exercises with `re-search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9349 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9350
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9351 * Write a function to search for a regular expression that matches
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9352 two or more blank lines in sequence.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9353
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9354 * Write a function to search for duplicated words, such as `the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9355 the'. *Note Syntax of Regular Expressions: (emacs)Regexps, for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9356 information on how to write a regexp (a regular expression) to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9357 match a string that is composed of two identical halves. You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9358 can devise several regexps; some are better than others. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9359 function I use is described in an appendix, along with several
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9360 regexps. *Note `the-the' Duplicated Words Function: the-the.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9361
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9362 Counting: Repetition and Regexps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9363 ********************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9364
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9365 Repetition and regular expression searches are powerful tools that you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9366 often use when you write code in Emacs Lisp. This chapter illustrates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9367 the use of regular expression searches through the construction of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9368 word count commands using `while' loops and recursion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9369
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9370 Counting words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9371 ==============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9372
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9373 The standard Emacs distribution contains a function for counting the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9374 number of lines within a region. However, there is no corresponding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9375 function for counting words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9376
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9377 Certain types of writing ask you to count words. Thus, if you write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9378 an essay, you may be limited to 800 words; if you write a novel, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9379 may discipline yourself to write 1000 words a day. It seems odd to me
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9380 that Emacs lacks a word count command. Perhaps people use Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9381 mostly for code or types of documentation that do not require word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9382 counts; or perhaps they restrict themselves to the operating system
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9383 word count command, `wc'. Alternatively, people may follow the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9384 publishers' convention and compute a word count by dividing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9385 number of characters in a document by five. In any event, here are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9386 commands to count words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9387
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9388 The `count-words-region' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9389 =================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9390
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9391 A word count command could count words in a line, paragraph, region,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9392 or buffer. What should the command cover? You could design the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9393 command to count the number of words in a complete buffer. However,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9394 the Emacs tradition encourages flexibility--you may want to count
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9395 words in just a section, rather than all of a buffer. So it makes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9396 more sense to design the command to count the number of words in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9397 region. Once you have a `count-words-region' command, you can, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9398 you wish, count words in a whole buffer by marking it with `C-x h'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9399 (`mark-whole-buffer').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9400
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9401 Clearly, counting words is a repetitive act: starting from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9402 beginning of the region, you count the first word, then the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9403 word, then the third word, and so on, until you reach the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9404 region. This means that word counting is ideally suited to recursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9405 or to a `while' loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9406
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9407 Designing `count-words-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9408 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9409
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9410 First, we will implement the word count command with a `while' loop,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9411 then with recursion. The command will, of course, be interactive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9412
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9413 The template for an interactive function definition is, as always:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9414
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9415 (defun NAME-OF-FUNCTION (ARGUMENT-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9416 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9417 (INTERACTIVE-EXPRESSION...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9418 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9419
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9420 What we need to do is fill in the slots.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9421
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9422 The name of the function should be self-explanatory and similar to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9423 existing `count-lines-region' name. This makes the name easier to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9424 remember. `count-words-region' is a good choice.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9425
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9426 The function counts words within a region. This means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9427 argument list must contain symbols that are bound to the two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9428 positions, the beginning and end of the region. These two positions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9429 can be called `beginning' and `end' respectively. The first line of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9430 the documentation should be a single sentence, since that is all that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9431 is printed as documentation by a command such as `apropos'. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9432 interactive expression will be of the form `(interactive "r")', since
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9433 that will cause Emacs to pass the beginning and end of the region to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9434 the function's argument list. All this is routine.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9435
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9436 The body of the function needs to be written to do three tasks:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9437 first, to set up conditions under which the `while' loop can count
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9438 words, second, to run the `while' loop, and third, to send a message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9439 to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9440
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9441 When a user calls `count-words-region', point may be at the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9442 or the end of the region. However, the counting process must start
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9443 at the beginning of the region. This means we will want to put point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9444 there if it is not already there. Executing `(goto-char beginning)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9445 ensures this. Of course, we will want to return point to its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9446 expected position when the function finishes its work. For this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9447 reason, the body must be enclosed in a `save-excursion' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9448
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9449 The central part of the body of the function consists of a `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9450 loop in which one expression jumps point forward word by word, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9451 another expression counts those jumps. The true-or-false-test of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9452 `while' loop should test true so long as point should jump forward,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9453 and false when point is at the end of the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9454
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9455 We could use `(forward-word 1)' as the expression for moving point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9456 forward word by word, but it is easier to see what Emacs identifies
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9457 as a `word' if we use a regular expression search.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9458
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9459 A regular expression search that finds the pattern for which it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9460 searching leaves point after the last character matched. This means
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9461 that a succession of successful word searches will move point forward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9462 word by word.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9463
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9464 As a practical matter, we want the regular expression search to jump
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9465 over whitespace and punctuation between words as well as over the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9466 words themselves. A regexp that refuses to jump over interword
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9467 whitespace would never jump more than one word! This means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9468 regexp should include the whitespace and punctuation that follows a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9469 word, if any, as well as the word itself. (A word may end a buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9470 and not have any following whitespace or punctuation, so that part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9471 the regexp must be optional.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9472
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9473 Thus, what we want for the regexp is a pattern defining one or more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9474 word constituent characters followed, optionally, by one or more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9475 characters that are not word constituents. The regular expression for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9476 this is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9477
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9478 \w+\W*
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9479
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9480 The buffer's syntax table determines which characters are and are not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9481 word constituents. (*Note What Constitutes a Word or Symbol?:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9482 Syntax, for more about syntax. Also, see *Note Syntax:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9483 (emacs)Syntax, and *Note Syntax Tables: (elisp)Syntax Tables.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9484
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9485 The search expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9486
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9487 (re-search-forward "\\w+\\W*")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9488
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9489 (Note that paired backslashes precede the `w' and `W'. A single
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9490 backslash has special meaning to the Emacs Lisp interpreter. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9491 indicates that the following character is interpreted differently than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9492 usual. For example, the two characters, `\n', stand for `newline',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9493 rather than for a backslash followed by `n'. Two backslashes in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9494 row stand for an ordinary, `unspecial' backslash.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9495
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9496 We need a counter to count how many words there are; this variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9497 must first be set to 0 and then incremented each time Emacs goes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9498 around the `while' loop. The incrementing expression is simply:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9499
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9500 (setq count (1+ count))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9501
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9502 Finally, we want to tell the user how many words there are in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9503 region. The `message' function is intended for presenting this kind
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9504 of information to the user. The message has to be phrased so that it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9505 reads properly regardless of how many words there are in the region:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9506 we don't want to say that "there are 1 words in the region". The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9507 conflict between singular and plural is ungrammatical. We can solve
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9508 this problem by using a conditional expression that evaluates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9509 different messages depending on the number of words in the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9510 There are three possibilities: no words in the region, one word in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9511 region, and more than one word. This means that the `cond' special
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9512 form is appropriate.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9513
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9514 All this leads to the following function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9515
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9516 ;;; First version; has bugs!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9517 (defun count-words-region (beginning end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9518 "Print number of words in the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9519 Words are defined as at least one word-constituent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9520 character followed by at least one character that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9521 is not a word-constituent. The buffer's syntax
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9522 table determines which characters these are."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9523 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9524 (message "Counting words in region ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9525
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9526 ;;; 1. Set up appropriate conditions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9527 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9528 (goto-char beginning)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9529 (let ((count 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9530
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9531 ;;; 2. Run the while loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9532 (while (< (point) end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9533 (re-search-forward "\\w+\\W*")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9534 (setq count (1+ count)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9535
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9536 ;;; 3. Send a message to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9537 (cond ((zerop count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9538 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9539 "The region does NOT have any words."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9540 ((= 1 count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9541 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9542 "The region has 1 word."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9543 (t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9544 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9545 "The region has %d words." count))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9546
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9547 As written, the function works, but not in all circumstances.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9548
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9549 The Whitespace Bug in `count-words-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9550 ------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9551
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9552 The `count-words-region' command described in the preceding section
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9553 has two bugs, or rather, one bug with two manifestations. First, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9554 you mark a region containing only whitespace in the middle of some
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9555 text, the `count-words-region' command tells you that the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9556 contains one word! Second, if you mark a region containing only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9557 whitespace at the end of the buffer or the accessible portion of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9558 narrowed buffer, the command displays an error message that looks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9559 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9560
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9561 Search failed: "\\w+\\W*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9562
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9563 If you are reading this in Info in GNU Emacs, you can test for these
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9564 bugs yourself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9565
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9566 First, evaluate the function in the usual manner to install it. Here
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9567 is a copy of the definition. Place your cursor after the closing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9568 parenthesis and type `C-x C-e' to install it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9569
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9570 ;; First version; has bugs!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9571 (defun count-words-region (beginning end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9572 "Print number of words in the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9573 Words are defined as at least one word-constituent character followed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9574 by at least one character that is not a word-constituent. The buffer's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9575 syntax table determines which characters these are."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9576 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9577 (message "Counting words in region ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9578
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9579 ;;; 1. Set up appropriate conditions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9580 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9581 (goto-char beginning)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9582 (let ((count 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9583
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9584 ;;; 2. Run the while loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9585 (while (< (point) end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9586 (re-search-forward "\\w+\\W*")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9587 (setq count (1+ count)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9588
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9589 ;;; 3. Send a message to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9590 (cond ((zerop count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9591 (message "The region does NOT have any words."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9592 ((= 1 count) (message "The region has 1 word."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9593 (t (message "The region has %d words." count))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9594
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9595 If you wish, you can also install this keybinding by evaluating it:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9596
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9597 (global-set-key "\C-c=" 'count-words-region)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9598
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9599 To conduct the first test, set mark and point to the beginning and end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9600 of the following line and then type `C-c =' (or `M-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9601 count-words-region' if you have not bound `C-c ='):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9602
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9603 one two three
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9604
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9605 Emacs will tell you, correctly, that the region has three words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9606
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9607 Repeat the test, but place mark at the beginning of the line and place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9608 point just _before_ the word `one'. Again type the command `C-c ='
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9609 (or `M-x count-words-region'). Emacs should tell you that the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9610 has no words, since it is composed only of the whitespace at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9611 beginning of the line. But instead Emacs tells you that the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9612 has one word!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9613
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9614 For the third test, copy the sample line to the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9615 `*scratch*' buffer and then type several spaces at the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9616 line. Place mark right after the word `three' and point at the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9617 of line. (The end of the line will be the end of the buffer.) Type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9618 `C-c =' (or `M-x count-words-region') as you did before. Again,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9619 Emacs should tell you that the region has no words, since it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9620 composed only of the whitespace at the end of the line. Instead,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9621 Emacs displays an error message saying `Search failed'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9622
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9623 The two bugs stem from the same problem.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9624
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9625 Consider the first manifestation of the bug, in which the command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9626 tells you that the whitespace at the beginning of the line contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9627 one word. What happens is this: The `M-x count-words-region' command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9628 moves point to the beginning of the region. The `while' tests
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9629 whether the value of point is smaller than the value of `end', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9630 it is. Consequently, the regular expression search looks for and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9631 finds the first word. It leaves point after the word. `count' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9632 set to one. The `while' loop repeats; but this time the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9633 point is larger than the value of `end', the loop is exited; and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9634 function displays a message saying the number of words in the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9635 is one. In brief, the regular expression search looks for and finds
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9636 the word even though it is outside the marked region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9637
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9638 In the second manifestation of the bug, the region is whitespace at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9639 the end of the buffer. Emacs says `Search failed'. What happens is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9640 that the true-or-false-test in the `while' loop tests true, so the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9641 search expression is executed. But since there are no more words in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9642 the buffer, the search fails.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9643
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9644 In both manifestations of the bug, the search extends or attempts to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9645 extend outside of the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9646
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9647 The solution is to limit the search to the region--this is a fairly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9648 simple action, but as you may have come to expect, it is not quite as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9649 simple as you might think.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9650
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9651 As we have seen, the `re-search-forward' function takes a search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9652 pattern as its first argument. But in addition to this first,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9653 mandatory argument, it accepts three optional arguments. The optional
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9654 second argument bounds the search. The optional third argument, if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9655 `t', causes the function to return `nil' rather than signal an error
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9656 if the search fails. The optional fourth argument is a repeat count.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9657 (In Emacs, you can see a function's documentation by typing `C-h f',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9658 the name of the function, and then <RET>.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9659
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9660 In the `count-words-region' definition, the value of the end of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9661 region is held by the variable `end' which is passed as an argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9662 to the function. Thus, we can add `end' as an argument to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9663 regular expression search expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9664
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9665 (re-search-forward "\\w+\\W*" end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9666
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9667 However, if you make only this change to the `count-words-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9668 definition and then test the new version of the definition on a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9669 stretch of whitespace, you will receive an error message saying
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9670 `Search failed'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9671
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9672 What happens is this: the search is limited to the region, and fails
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9673 as you expect because there are no word-constituent characters in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9674 region. Since it fails, we receive an error message. But we do not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9675 want to receive an error message in this case; we want to receive the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9676 message that "The region does NOT have any words."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9677
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9678 The solution to this problem is to provide `re-search-forward' with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9679 third argument of `t', which causes the function to return `nil'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9680 rather than signal an error if the search fails.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9681
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9682 However, if you make this change and try it, you will see the message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9683 "Counting words in region ... " and ... you will keep on seeing that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9684 message ..., until you type `C-g' (`keyboard-quit').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9685
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9686 Here is what happens: the search is limited to the region, as before,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9687 and it fails because there are no word-constituent characters in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9688 region, as expected. Consequently, the `re-search-forward'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9689 expression returns `nil'. It does nothing else. In particular, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9690 does not move point, which it does as a side effect if it finds the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9691 search target. After the `re-search-forward' expression returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9692 `nil', the next expression in the `while' loop is evaluated. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9693 expression increments the count. Then the loop repeats. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9694 true-or-false-test tests true because the value of point is still less
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9695 than the value of end, since the `re-search-forward' expression did
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9696 not move point. ... and the cycle repeats ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9697
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9698 The `count-words-region' definition requires yet another
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9699 modification, to cause the true-or-false-test of the `while' loop to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9700 test false if the search fails. Put another way, there are two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9701 conditions that must be satisfied in the true-or-false-test before the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9702 word count variable is incremented: point must still be within the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9703 region and the search expression must have found a word to count.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9704
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9705 Since both the first condition and the second condition must be true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9706 together, the two expressions, the region test and the search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9707 expression, can be joined with an `and' special form and embedded in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9708 the `while' loop as the true-or-false-test, like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9709
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9710 (and (< (point) end) (re-search-forward "\\w+\\W*" end t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9711
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9712 (*Note forward-paragraph::, for information about `and'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9713
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9714 The `re-search-forward' expression returns `t' if the search succeeds
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9715 and as a side effect moves point. Consequently, as words are found,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9716 point is moved through the region. When the search expression fails
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9717 to find another word, or when point reaches the end of the region,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9718 the true-or-false-test tests false, the `while' loop exists, and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9719 `count-words-region' function displays one or other of its messages.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9720
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9721 After incorporating these final changes, the `count-words-region'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9722 works without bugs (or at least, without bugs that I have found!).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9723 Here is what it looks like:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9724
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9725 ;;; Final version: `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9726 (defun count-words-region (beginning end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9727 "Print number of words in the region."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9728 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9729 (message "Counting words in region ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9730
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9731 ;;; 1. Set up appropriate conditions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9732 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9733 (let ((count 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9734 (goto-char beginning)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9735
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9736 ;;; 2. Run the while loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9737 (while (and (< (point) end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9738 (re-search-forward "\\w+\\W*" end t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9739 (setq count (1+ count)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9741 ;;; 3. Send a message to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9742 (cond ((zerop count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9743 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9744 "The region does NOT have any words."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9745 ((= 1 count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9746 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9747 "The region has 1 word."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9748 (t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9749 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9750 "The region has %d words." count))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9751
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9752 Count Words Recursively
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9753 =======================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9754
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9755 You can write the function for counting words recursively as well as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9756 with a `while' loop. Let's see how this is done.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9757
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9758 First, we need to recognize that the `count-words-region' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9759 has three jobs: it sets up the appropriate conditions for counting to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9760 occur; it counts the words in the region; and it sends a message to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9761 the user telling how many words there are.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9762
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9763 If we write a single recursive function to do everything, we will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9764 receive a message for every recursive call. If the region contains 13
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9765 words, we will receive thirteen messages, one right after the other.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9766 We don't want this! Instead, we must write two functions to do the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9767 job, one of which (the recursive function) will be used inside of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9768 other. One function will set up the conditions and display the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9769 message; the other will return the word count.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9770
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9771 Let us start with the function that causes the message to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9772 displayed. We can continue to call this `count-words-region'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9774 This is the function that the user will call. It will be interactive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9775 Indeed, it will be similar to our previous versions of this function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9776 except that it will call `recursive-count-words' to determine how
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9777 many words are in the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9778
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9779 We can readily construct a template for this function, based on our
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9780 previous versions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9782 ;; Recursive version; uses regular expression search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9783 (defun count-words-region (beginning end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9784 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9785 (INTERACTIVE-EXPRESSION...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9786
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9787 ;;; 1. Set up appropriate conditions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9788 (EXPLANATORY MESSAGE)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9789 (SET-UP FUNCTIONS...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9790
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9791 ;;; 2. Count the words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9792 RECURSIVE CALL
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9794 ;;; 3. Send a message to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9795 MESSAGE PROVIDING WORD COUNT))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9797 The definition looks straightforward, except that somehow the count
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9798 returned by the recursive call must be passed to the message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9799 displaying the word count. A little thought suggests that this can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9800 done by making use of a `let' expression: we can bind a variable in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9801 the varlist of a `let' expression to the number of words in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9802 region, as returned by the recursive call; and then the `cond'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9803 expression, using binding, can display the value to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9804
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9805 Often, one thinks of the binding within a `let' expression as somehow
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9806 secondary to the `primary' work of a function. But in this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9807 what you might consider the `primary' job of the function, counting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9808 words, is done within the `let' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9809
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9810 Using `let', the function definition looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9811
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9812 (defun count-words-region (beginning end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9813 "Print number of words in the region."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9814 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9816 ;;; 1. Set up appropriate conditions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9817 (message "Counting words in region ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9818 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9819 (goto-char beginning)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9820
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9821 ;;; 2. Count the words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9822 (let ((count (recursive-count-words end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9823
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9824 ;;; 3. Send a message to the user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9825 (cond ((zerop count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9826 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9827 "The region does NOT have any words."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9828 ((= 1 count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9829 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9830 "The region has 1 word."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9831 (t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9832 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9833 "The region has %d words." count))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9834
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9835 Next, we need to write the recursive counting function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9836
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9837 A recursive function has at least three parts: the `do-again-test',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9838 the `next-step-expression', and the recursive call.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9839
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9840 The do-again-test determines whether the function will or will not be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9841 called again. Since we are counting words in a region and can use a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9842 function that moves point forward for every word, the do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9843 can check whether point is still within the region. The do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9844 should find the value of point and determine whether point is before,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9845 at, or after the value of the end of the region. We can use the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9846 `point' function to locate point. Clearly, we must pass the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9847 the end of the region to the recursive counting function as an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9848 argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9849
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9850 In addition, the do-again-test should also test whether the search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9851 finds a word. If it does not, the function should not call itself
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9852 again.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9853
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9854 The next-step-expression changes a value so that when the recursive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9855 function is supposed to stop calling itself, it stops. More
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9856 precisely, the next-step-expression changes a value so that at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9857 right time, the do-again-test stops the recursive function from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9858 calling itself again. In this case, the next-step-expression can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9859 the expression that moves point forward, word by word.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9860
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9861 The third part of a recursive function is the recursive call.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9862
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9863 Somewhere, also, we also need a part that does the `work' of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9864 function, a part that does the counting. A vital part!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9865
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9866 But already, we have an outline of the recursive counting function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9867
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9868 (defun recursive-count-words (region-end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9869 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9870 DO-AGAIN-TEST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9871 NEXT-STEP-EXPRESSION
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9872 RECURSIVE CALL)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9873
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9874 Now we need to fill in the slots. Let's start with the simplest cases
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9875 first: if point is at or beyond the end of the region, there cannot
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9876 be any words in the region, so the function should return zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9877 Likewise, if the search fails, there are no words to count, so the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9878 function should return zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9879
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9880 On the other hand, if point is within the region and the search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9881 succeeds, the function should call itself again.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9883 Thus, the do-again-test should look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9884
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9885 (and (< (point) region-end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9886 (re-search-forward "\\w+\\W*" region-end t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9888 Note that the search expression is part of the do-again-test--the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9889 function returns `t' if its search succeeds and `nil' if it fails.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9890 (*Note The Whitespace Bug in `count-words-region': Whitespace Bug,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9891 for an explanation of how `re-search-forward' works.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9892
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9893 The do-again-test is the true-or-false test of an `if' clause.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9894 Clearly, if the do-again-test succeeds, the then-part of the `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9895 clause should call the function again; but if it fails, the else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9896 should return zero since either point is outside the region or the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9897 search failed because there were no words to find.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9898
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9899 But before considering the recursive call, we need to consider the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9900 next-step-expression. What is it? Interestingly, it is the search
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9901 part of the do-again-test.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9902
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9903 In addition to returning `t' or `nil' for the do-again-test,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9904 `re-search-forward' moves point forward as a side effect of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9905 successful search. This is the action that changes the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9906 point so that the recursive function stops calling itself when point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9907 completes its movement through the region. Consequently, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9908 `re-search-forward' expression is the next-step-expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9909
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9910 In outline, then, the body of the `recursive-count-words' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9911 looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9912
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9913 (if DO-AGAIN-TEST-AND-NEXT-STEP-COMBINED
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9914 ;; then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9915 RECURSIVE-CALL-RETURNING-COUNT
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9916 ;; else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9917 RETURN-ZERO)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9918
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9919 How to incorporate the mechanism that counts?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9920
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9921 If you are not used to writing recursive functions, a question like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9922 this can be troublesome. But it can and should be approached
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9923 systematically.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9924
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9925 We know that the counting mechanism should be associated in some way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9926 with the recursive call. Indeed, since the next-step-expression moves
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9927 point forward by one word, and since a recursive call is made for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9928 each word, the counting mechanism must be an expression that adds one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9929 to the value returned by a call to `recursive-count-words'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9930
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9931 Consider several cases:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9932
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9933 * If there are two words in the region, the function should return
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9934 a value resulting from adding one to the value returned when it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9935 counts the first word, plus the number returned when it counts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9936 the remaining words in the region, which in this case is one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9937
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9938 * If there is one word in the region, the function should return a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9939 value resulting from adding one to the value returned when it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9940 counts that word, plus the number returned when it counts the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9941 remaining words in the region, which in this case is zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9942
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9943 * If there are no words in the region, the function should return
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9944 zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9945
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9946 From the sketch we can see that the else-part of the `if' returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9947 zero for the case of no words. This means that the then-part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9948 `if' must return a value resulting from adding one to the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9949 returned from a count of the remaining words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9950
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9951 The expression will look like this, where `1+' is a function that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9952 adds one to its argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9953
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9954 (1+ (recursive-count-words region-end))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9955
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9956 The whole `recursive-count-words' function will then look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9957
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9958 (defun recursive-count-words (region-end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9959 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9960
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9961 ;;; 1. do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9962 (if (and (< (point) region-end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9963 (re-search-forward "\\w+\\W*" region-end t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9964
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9965 ;;; 2. then-part: the recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9966 (1+ (recursive-count-words region-end))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9967
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9968 ;;; 3. else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9969 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9970
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9971 Let's examine how this works:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9972
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9973 If there are no words in the region, the else part of the `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9974 expression is evaluated and consequently the function returns zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9975
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9976 If there is one word in the region, the value of point is less than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9977 the value of `region-end' and the search succeeds. In this case, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9978 true-or-false-test of the `if' expression tests true, and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9979 then-part of the `if' expression is evaluated. The counting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9980 expression is evaluated. This expression returns a value (which will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9981 be the value returned by the whole function) that is the sum of one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9982 added to the value returned by a recursive call.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9983
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9984 Meanwhile, the next-step-expression has caused point to jump over the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9985 first (and in this case only) word in the region. This means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9986 when `(recursive-count-words region-end)' is evaluated a second time,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9987 as a result of the recursive call, the value of point will be equal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9988 to or greater than the value of region end. So this time,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9989 `recursive-count-words' will return zero. The zero will be added to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9990 one, and the original evaluation of `recursive-count-words' will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9991 return one plus zero, which is one, which is the correct amount.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9992
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9993 Clearly, if there are two words in the region, the first call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9994 `recursive-count-words' returns one added to the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9995 calling `recursive-count-words' on a region containing the remaining
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9996 word--that is, it adds one to one, producing two, which is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9997 correct amount.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9998
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
9999 Similarly, if there are three words in the region, the first call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10000 `recursive-count-words' returns one added to the value returned by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10001 calling `recursive-count-words' on a region containing the remaining
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10002 two words--and so on and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10003
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10004 With full documentation the two functions look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10006 The recursive function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10007
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10008 (defun recursive-count-words (region-end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10009 "Number of words between point and REGION-END."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10010
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10011 ;;; 1. do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10012 (if (and (< (point) region-end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10013 (re-search-forward "\\w+\\W*" region-end t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10014
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10015 ;;; 2. then-part: the recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10016 (1+ (recursive-count-words region-end))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10017
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10018 ;;; 3. else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10019 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10020
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10021 The wrapper:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10022
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10023 ;;; Recursive version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10024 (defun count-words-region (beginning end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10025 "Print number of words in the region.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10026
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10027 Words are defined as at least one word-constituent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10028 character followed by at least one character that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10029 not a word-constituent. The buffer's syntax table
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10030 determines which characters these are."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10031 (interactive "r")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10032 (message "Counting words in region ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10033 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10034 (goto-char beginning)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10035 (let ((count (recursive-count-words end)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10036 (cond ((zerop count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10037 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10038 "The region does NOT have any words."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10039 ((= 1 count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10040 (message "The region has 1 word."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10041 (t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10042 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10043 "The region has %d words." count))))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10044
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10045 Exercise: Counting Punctuation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10046 ==============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10047
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10048 Using a `while' loop, write a function to count the number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10049 punctuation marks in a region--period, comma, semicolon, colon,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10050 exclamation mark, and question mark. Do the same using recursion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10051
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10052 Counting Words in a `defun'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10053 ***************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10054
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10055 Our next project is to count the number of words in a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10056 definition. Clearly, this can be done using some variant of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10057 `count-word-region'. *Note Counting Words: Repetition and Regexps:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10058 Counting Words. If we are just going to count the words in one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10059 definition, it is easy enough to mark the definition with the `C-M-h'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10060 (`mark-defun') command, and then call `count-word-region'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10062 However, I am more ambitious: I want to count the words and symbols in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10063 every definition in the Emacs sources and then print a graph that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10064 shows how many functions there are of each length: how many contain 40
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10065 to 49 words or symbols, how many contain 50 to 59 words or symbols,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10066 and so on. I have often been curious how long a typical function is,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10067 and this will tell.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10068
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10069 Divide and Conquer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10070 ==================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10072 Described in one phrase, the histogram project is daunting; but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10073 divided into numerous small steps, each of which we can take one at a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10074 time, the project becomes less fearsome. Let us consider what the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10075 steps must be:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10076
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10077 * First, write a function to count the words in one definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10078 This includes the problem of handling symbols as well as words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10079
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10080 * Second, write a function to list the numbers of words in each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10081 function in a file. This function can use the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10082 `count-words-in-defun' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10083
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10084 * Third, write a function to list the numbers of words in each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10085 function in each of several files. This entails automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10086 finding the various files, switching to them, and counting the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10087 words in the definitions within them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10088
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10089 * Fourth, write a function to convert the list of numbers that we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10090 created in step three to a form that will be suitable for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10091 printing as a graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10093 * Fifth, write a function to print the results as a graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10094
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10095 This is quite a project! But if we take each step slowly, it will not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10096 be difficult.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10097
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10098 What to Count?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10099 ==============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10101 When we first start thinking about how to count the words in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10102 function definition, the first question is (or ought to be) what are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10103 we going to count? When we speak of `words' with respect to a Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10104 function definition, we are actually speaking, in large part, of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10105 `symbols'. For example, the following `multiply-by-seven' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10106 contains the five symbols `defun', `multiply-by-seven', `number',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10107 `*', and `7'. In addition, in the documentation string, it contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10108 the four words `Multiply', `NUMBER', `by', and `seven'. The symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10109 `number' is repeated, so the definition contains a total of ten words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10110 and symbols.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10112 (defun multiply-by-seven (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10113 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10114 (* 7 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10115
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10116 However, if we mark the `multiply-by-seven' definition with `C-M-h'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10117 (`mark-defun'), and then call `count-words-region' on it, we will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10118 find that `count-words-region' claims the definition has eleven
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10119 words, not ten! Something is wrong!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10121 The problem is twofold: `count-words-region' does not count the `*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10122 as a word, and it counts the single symbol, `multiply-by-seven', as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10123 containing three words. The hyphens are treated as if they were
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10124 interword spaces rather than intraword connectors:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10125 `multiply-by-seven' is counted as if it were written `multiply by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10126 seven'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10127
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10128 The cause of this confusion is the regular expression search within
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10129 the `count-words-region' definition that moves point forward word by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10130 word. In the canonical version of `count-words-region', the regexp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10131 is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10133 "\\w+\\W*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10134
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10135 This regular expression is a pattern defining one or more word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10136 constituent characters possibly followed by one or more characters
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10137 that are not word constituents. What is meant by `word constituent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10138 characters' brings us to the issue of syntax, which is worth a section
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10139 of its own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10140
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10141 What Constitutes a Word or Symbol?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10142 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10143
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10144 Emacs treats different characters as belonging to different "syntax
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10145 categories". For example, the regular expression, `\\w+', is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10146 pattern specifying one or more _word constituent_ characters. Word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10147 constituent characters are members of one syntax category. Other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10148 syntax categories include the class of punctuation characters, such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10149 as the period and the comma, and the class of whitespace characters,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10150 such as the blank space and the tab character. (For more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10151 information, see *Note Syntax: (emacs)Syntax, and *Note Syntax
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10152 Tables: (elisp)Syntax Tables.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10153
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10154 Syntax tables specify which characters belong to which categories.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10155 Usually, a hyphen is not specified as a `word constituent character'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10156 Instead, it is specified as being in the `class of characters that are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10157 part of symbol names but not words.' This means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10158 `count-words-region' function treats it in the same way it treats an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10159 interword white space, which is why `count-words-region' counts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10160 `multiply-by-seven' as three words.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10162 There are two ways to cause Emacs to count `multiply-by-seven' as one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10163 symbol: modify the syntax table or modify the regular expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10164
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10165 We could redefine a hyphen as a word constituent character by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10166 modifying the syntax table that Emacs keeps for each mode. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10167 action would serve our purpose, except that a hyphen is merely the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10168 most common character within symbols that is not typically a word
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10169 constituent character; there are others, too.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10170
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10171 Alternatively, we can redefine the regular expression used in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10172 `count-words' definition so as to include symbols. This procedure
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10173 has the merit of clarity, but the task is a little tricky.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10174
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10175 The first part is simple enough: the pattern must match "at least one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10176 character that is a word or symbol constituent". Thus:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10177
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10178 "\\(\\w\\|\\s_\\)+"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10179
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10180 The `\\(' is the first part of the grouping construct that includes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10181 the `\\w' and the `\\s_' as alternatives, separated by the `\\|'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10182 The `\\w' matches any word-constituent character and the `\\s_'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10183 matches any character that is part of a symbol name but not a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10184 word-constituent character. The `+' following the group indicates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10185 that the word or symbol constituent characters must be matched at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10186 least once.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10187
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10188 However, the second part of the regexp is more difficult to design.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10189 What we want is to follow the first part with "optionally one or more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10190 characters that are not constituents of a word or symbol". At first,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10191 I thought I could define this with the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10192
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10193 "\\(\\W\\|\\S_\\)*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10194
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10195 The upper case `W' and `S' match characters that are _not_ word or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10196 symbol constituents. Unfortunately, this expression matches any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10197 character that is either not a word constituent or not a symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10198 constituent. This matches any character!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10199
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10200 I then noticed that every word or symbol in my test region was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10201 followed by white space (blank space, tab, or newline). So I tried
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10202 placing a pattern to match one or more blank spaces after the pattern
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10203 for one or more word or symbol constituents. This failed, too. Words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10204 and symbols are often separated by whitespace, but in actual code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10205 parentheses may follow symbols and punctuation may follow words. So
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10206 finally, I designed a pattern in which the word or symbol constituents
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10207 are followed optionally by characters that are not white space and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10208 then followed optionally by white space.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10209
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10210 Here is the full regular expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10211
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10212 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10213
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10214 The `count-words-in-defun' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10215 ===================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10216
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10217 We have seen that there are several ways to write a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10218 `count-word-region' function. To write a `count-words-in-defun', we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10219 need merely adapt one of these versions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10220
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10221 The version that uses a `while' loop is easy to understand, so I am
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10222 going to adapt that. Because `count-words-in-defun' will be part of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10223 a more complex program, it need not be interactive and it need not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10224 display a message but just return the count. These considerations
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10225 simplify the definition a little.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10226
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10227 On the other hand, `count-words-in-defun' will be used within a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10228 buffer that contains function definitions. Consequently, it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10229 reasonable to ask that the function determine whether it is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10230 when point is within a function definition, and if it is, to return
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10231 the count for that definition. This adds complexity to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10232 definition, but saves us from needing to pass arguments to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10233 function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10234
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10235 These considerations lead us to prepare the following template:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10236
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10237 (defun count-words-in-defun ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10238 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10239 (SET UP...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10240 (WHILE LOOP...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10241 RETURN COUNT)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10242
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10243 As usual, our job is to fill in the slots.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10244
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10245 First, the set up.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10246
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10247 We are presuming that this function will be called within a buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10248 containing function definitions. Point will either be within a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10249 function definition or not. For `count-words-in-defun' to work,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10250 point must move to the beginning of the definition, a counter must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10251 start at zero, and the counting loop must stop when point reaches the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10252 end of the definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10253
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10254 The `beginning-of-defun' function searches backwards for an opening
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10255 delimiter such as a `(' at the beginning of a line, and moves point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10256 to that position, or else to the limit of the search. In practice,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10257 this means that `beginning-of-defun' moves point to the beginning of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10258 an enclosing or preceding function definition, or else to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10259 beginning of the buffer. We can use `beginning-of-defun' to place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10260 point where we wish to start.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10261
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10262 The `while' loop requires a counter to keep track of the words or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10263 symbols being counted. A `let' expression can be used to create a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10264 local variable for this purpose, and bind it to an initial value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10265 zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10266
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10267 The `end-of-defun' function works like `beginning-of-defun' except
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10268 that it moves point to the end of the definition. `end-of-defun' can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10269 be used as part of an expression that determines the position of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10270 end of the definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10271
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10272 The set up for `count-words-in-defun' takes shape rapidly: first we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10273 move point to the beginning of the definition, then we create a local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10274 variable to hold the count, and finally, we record the position of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10275 the end of the definition so the `while' loop will know when to stop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10276 looping.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10277
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10278 The code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10279
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10280 (beginning-of-defun)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10281 (let ((count 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10282 (end (save-excursion (end-of-defun) (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10283
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10284 The code is simple. The only slight complication is likely to concern
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10285 `end': it is bound to the position of the end of the definition by a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10286 `save-excursion' expression that returns the value of point after
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10287 `end-of-defun' temporarily moves it to the end of the definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10288
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10289 The second part of the `count-words-in-defun', after the set up, is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10290 the `while' loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10291
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10292 The loop must contain an expression that jumps point forward word by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10293 word and symbol by symbol, and another expression that counts the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10294 jumps. The true-or-false-test for the `while' loop should test true
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10295 so long as point should jump forward, and false when point is at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10296 end of the definition. We have already redefined the regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10297 expression for this (*note Syntax::), so the loop is straightforward:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10298
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10299 (while (and (< (point) end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10300 (re-search-forward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10301 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*" end t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10302 (setq count (1+ count)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10303
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10304 The third part of the function definition returns the count of words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10305 and symbols. This part is the last expression within the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10306 `let' expression, and can be, very simply, the local variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10307 `count', which when evaluated returns the count.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10308
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10309 Put together, the `count-words-in-defun' definition looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10310
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10311 (defun count-words-in-defun ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10312 "Return the number of words and symbols in a defun."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10313 (beginning-of-defun)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10314 (let ((count 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10315 (end (save-excursion (end-of-defun) (point))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10316 (while
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10317 (and (< (point) end)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10318 (re-search-forward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10319 "\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10320 end t))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10321 (setq count (1+ count)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10322 count))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10323
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10324 How to test this? The function is not interactive, but it is easy to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10325 put a wrapper around the function to make it interactive; we can use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10326 almost the same code as for the recursive version of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10327 `count-words-region':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10329 ;;; Interactive version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10330 (defun count-words-defun ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10331 "Number of words and symbols in a function definition."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10332 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10333 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10334 "Counting words and symbols in function definition ... ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10335 (let ((count (count-words-in-defun)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10336 (cond
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10337 ((zerop count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10338 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10339 "The definition does NOT have any words or symbols."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10340 ((= 1 count)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10341 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10342 "The definition has 1 word or symbol."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10343 (t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10344 (message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10345 "The definition has %d words or symbols." count)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10346
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10347 Let's re-use `C-c =' as a convenient keybinding:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10348
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10349 (global-set-key "\C-c=" 'count-words-defun)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10350
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10351 Now we can try out `count-words-defun': install both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10352 `count-words-in-defun' and `count-words-defun', and set the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10353 keybinding, and then place the cursor within the following definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10354
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10355 (defun multiply-by-seven (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10356 "Multiply NUMBER by seven."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10357 (* 7 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10358 => 10
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10359
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10360 Success! The definition has 10 words and symbols.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10361
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10362 The next problem is to count the numbers of words and symbols in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10363 several definitions within a single file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10364
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10365 Count Several `defuns' Within a File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10366 ====================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10367
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10368 A file such as `simple.el' may have 80 or more function definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10369 within it. Our long term goal is to collect statistics on many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10370 files, but as a first step, our immediate goal is to collect
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10371 statistics on one file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10372
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10373 The information will be a series of numbers, each number being the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10374 length of a function definition. We can store the numbers in a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10375
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10376 We know that we will want to incorporate the information regarding one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10377 file with information about many other files; this means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10378 function for counting definition lengths within one file need only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10379 return the list of lengths. It need not and should not display any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10380 messages.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10381
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10382 The word count commands contain one expression to jump point forward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10383 word by word and another expression to count the jumps. The function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10384 to return the lengths of definitions can be designed to work the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10385 way, with one expression to jump point forward definition by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10386 definition and another expression to construct the lengths' list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10387
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10388 This statement of the problem makes it elementary to write the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10389 function definition. Clearly, we will start the count at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10390 beginning of the file, so the first command will be `(goto-char
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10391 (point-min))'. Next, we start the `while' loop; and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10392 true-or-false test of the loop can be a regular expression search for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10393 the next function definition--so long as the search succeeds, point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10394 is moved forward and then the body of the loop is evaluated. The body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10395 needs an expression that constructs the lengths' list. `cons', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10396 list construction command, can be used to create the list. That is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10397 almost all there is to it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10398
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10399 Here is what this fragment of code looks like:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10400
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10401 (goto-char (point-min))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10402 (while (re-search-forward "^(defun" nil t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10403 (setq lengths-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10404 (cons (count-words-in-defun) lengths-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10405
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10406 What we have left out is the mechanism for finding the file that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10407 contains the function definitions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10408
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10409 In previous examples, we either used this, the Info file, or we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10410 switched back and forth to some other buffer, such as the `*scratch*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10411 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10412
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10413 Finding a file is a new process that we have not yet discussed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10414
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10415 Find a File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10416 ===========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10417
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10418 To find a file in Emacs, you use the `C-x C-f' (`find-file') command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10419 This command is almost, but not quite right for the lengths problem.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10420
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10421 Let's look at the source for `find-file' (you can use the `find-tag'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10422 command or `C-h f' (`describe-function') to find the source of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10423 function):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10424
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10425 (defun find-file (filename)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10426 "Edit file FILENAME.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10427 Switch to a buffer visiting file FILENAME,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10428 creating one if none already exists."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10429 (interactive "FFind file: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10430 (switch-to-buffer (find-file-noselect filename)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10431
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10432 The definition possesses short but complete documentation and an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10433 interactive specification that prompts you for a file name when you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10434 use the command interactively. The body of the definition contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10435 two functions, `find-file-noselect' and `switch-to-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10436
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10437 According to its documentation as shown by `C-h f' (the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10438 `describe-function' command), the `find-file-noselect' function reads
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10439 the named file into a buffer and returns the buffer. However, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10440 buffer is not selected. Emacs does not switch its attention (or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10441 yours if you are using `find-file-noselect') to the named buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10442 That is what `switch-to-buffer' does: it switches the buffer to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10443 Emacs attention is directed; and it switches the buffer displayed in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10444 the window to the new buffer. We have discussed buffer switching
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10445 elsewhere. (*Note Switching Buffers::.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10446
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10447 In this histogram project, we do not need to display each file on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10448 screen as the program determines the length of each definition within
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10449 it. Instead of employing `switch-to-buffer', we can work with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10450 `set-buffer', which redirects the attention of the computer program
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10451 to a different buffer but does not redisplay it on the screen. So
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10452 instead of calling on `find-file' to do the job, we must write our
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10453 own expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10454
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10455 The task is easy: use `find-file-noselect' and `set-buffer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10456
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10457 `lengths-list-file' in Detail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10458 =============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10459
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10460 The core of the `lengths-list-file' function is a `while' loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10461 containing a function to move point forward `defun by defun' and a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10462 function to count the number of words and symbols in each defun.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10463 This core must be surrounded by functions that do various other tasks,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10464 including finding the file, and ensuring that point starts out at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10465 beginning of the file. The function definition looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10466
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10467 (defun lengths-list-file (filename)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10468 "Return list of definitions' lengths within FILE.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10469 The returned list is a list of numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10470 Each number is the number of words or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10471 symbols in one function definition."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10472 (message "Working on `%s' ... " filename)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10473 (save-excursion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10474 (let ((buffer (find-file-noselect filename))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10475 (lengths-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10476 (set-buffer buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10477 (setq buffer-read-only t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10478 (widen)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10479 (goto-char (point-min))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10480 (while (re-search-forward "^(defun" nil t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10481 (setq lengths-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10482 (cons (count-words-in-defun) lengths-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10483 (kill-buffer buffer)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10484 lengths-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10485
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10486 The function is passed one argument, the name of the file on which it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10487 will work. It has four lines of documentation, but no interactive
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10488 specification. Since people worry that a computer is broken if they
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10489 don't see anything going on, the first line of the body is a message.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10490
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10491 The next line contains a `save-excursion' that returns Emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10492 attention to the current buffer when the function completes. This is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10493 useful in case you embed this function in another function that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10494 presumes point is restored to the original buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10495
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10496 In the varlist of the `let' expression, Emacs finds the file and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10497 binds the local variable `buffer' to the buffer containing the file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10498 At the same time, Emacs creates `lengths-list' as a local variable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10499
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10500 Next, Emacs switches its attention to the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10501
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10502 In the following line, Emacs makes the buffer read-only. Ideally,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10503 this line is not necessary. None of the functions for counting words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10504 and symbols in a function definition should change the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10505 Besides, the buffer is not going to be saved, even if it were changed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10506 This line is entirely the consequence of great, perhaps excessive,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10507 caution. The reason for the caution is that this function and those
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10508 it calls work on the sources for Emacs and it is very inconvenient if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10509 they are inadvertently modified. It goes without saying that I did
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10510 not realize a need for this line until an experiment went awry and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10511 started to modify my Emacs source files ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10512
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10513 Next comes a call to widen the buffer if it is narrowed. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10514 function is usually not needed--Emacs creates a fresh buffer if none
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10515 already exists; but if a buffer visiting the file already exists Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10516 returns that one. In this case, the buffer may be narrowed and must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10517 be widened. If we wanted to be fully `user-friendly', we would
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10518 arrange to save the restriction and the location of point, but we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10519 won't.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10520
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10521 The `(goto-char (point-min))' expression moves point to the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10522 of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10523
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10524 Then comes a `while' loop in which the `work' of the function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10525 carried out. In the loop, Emacs determines the length of each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10526 definition and constructs a lengths' list containing the information.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10527
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10528 Emacs kills the buffer after working through it. This is to save
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10529 space inside of Emacs. My version of Emacs 19 contained over 300
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10530 source files of interest; Emacs 21 contains over 800 source files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10531 Another function will apply `lengths-list-file' to each of the files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10532
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10533 Finally, the last expression within the `let' expression is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10534 `lengths-list' variable; its value is returned as the value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10535 whole function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10536
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10537 You can try this function by installing it in the usual fashion. Then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10538 place your cursor after the following expression and type `C-x C-e'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10539 (`eval-last-sexp').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10540
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10541 (lengths-list-file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10542 "/usr/local/share/emacs/21.0.100/lisp/emacs-lisp/debug.el")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10544 (You may need to change the pathname of the file; the one here worked
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10545 with GNU Emacs version 21.0.100. To change the expression, copy it to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10546 the `*scratch*' buffer and edit it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10547
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10548 (Also, to see the full length of the list, rather than a truncated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10549 version, you may have to evaluate the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10550
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10551 (custom-set-variables '(eval-expression-print-length nil))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10552
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10553 (*Note Setting Variables with `defcustom': defcustom. Then evaluate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10554 the `lengths-list-file' expression.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10555
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10556 The lengths' list for `debug.el' takes less than a second to produce
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10557 and looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10558
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10559 (77 95 85 87 131 89 50 25 44 44 68 35 64 45 17 34 167 457)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10560
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10561 (Using my old machine, the version 19 lengths' list for `debug.el'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10562 took seven seconds to produce and looked like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10563
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10564 (75 41 80 62 20 45 44 68 45 12 34 235)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10565
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10566 (The newer version of `debug.el' contains more defuns than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10567 earlier one; and my new machine is much faster than the old one.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10568
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10569 Note that the length of the last definition in the file is first in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10570 the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10571
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10572 Count Words in `defuns' in Different Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10573 ==========================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10574
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10575 In the previous section, we created a function that returns a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10576 the lengths of each definition in a file. Now, we want to define a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10577 function to return a master list of the lengths of the definitions in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10578 a list of files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10579
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10580 Working on each of a list of files is a repetitious act, so we can use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10581 either a `while' loop or recursion.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10582
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10583 Determine the lengths of `defuns'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10584 ---------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10585
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10586 The design using a `while' loop is routine. The argument passed the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10587 function is a list of files. As we saw earlier (*note Loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10588 Example::), you can write a `while' loop so that the body of the loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10589 is evaluated if such a list contains elements, but to exit the loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10590 if the list is empty. For this design to work, the body of the loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10591 must contain an expression that shortens the list each time the body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10592 is evaluated, so that eventually the list is empty. The usual
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10593 technique is to set the value of the list to the value of the CDR of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10594 the list each time the body is evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10595
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10596 The template looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10597
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10598 (while TEST-WHETHER-LIST-IS-EMPTY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10599 BODY...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10600 SET-LIST-TO-CDR-OF-LIST)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10601
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10602 Also, we remember that a `while' loop returns `nil' (the result of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10603 evaluating the true-or-false-test), not the result of any evaluation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10604 within its body. (The evaluations within the body of the loop are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10605 done for their side effects.) However, the expression that sets the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10606 lengths' list is part of the body--and that is the value that we want
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10607 returned by the function as a whole. To do this, we enclose the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10608 `while' loop within a `let' expression, and arrange that the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10609 element of the `let' expression contains the value of the lengths'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10610 list. (*Note Loop Example with an Incrementing Counter: Incrementing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10611 Example.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10612
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10613 These considerations lead us directly to the function itself:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10614
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10615 ;;; Use `while' loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10616 (defun lengths-list-many-files (list-of-files)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10617 "Return list of lengths of defuns in LIST-OF-FILES."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10618 (let (lengths-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10619
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10620 ;;; true-or-false-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10621 (while list-of-files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10622 (setq lengths-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10623 (append
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10624 lengths-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10625
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10626 ;;; Generate a lengths' list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10627 (lengths-list-file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10628 (expand-file-name (car list-of-files)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10629
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10630 ;;; Make files' list shorter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10631 (setq list-of-files (cdr list-of-files)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10632
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10633 ;;; Return final value of lengths' list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10634 lengths-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10635
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10636 `expand-file-name' is a built-in function that converts a file name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10637 to the absolute, long, path name form of the directory in which the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10638 function is called.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10639
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10640 Thus, if `expand-file-name' is called on `debug.el' when Emacs is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10641 visiting the `/usr/local/share/emacs/21.0.100/lisp/emacs-lisp/'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10642 directory,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10643
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10644 debug.el
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10645
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10646 becomes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10647
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10648 /usr/local/share/emacs/21.0.100/lisp/emacs-lisp/debug.el
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10649
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10650 The only other new element of this function definition is the as yet
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10651 unstudied function `append', which merits a short section for itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10652
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10653 The `append' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10654 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10655
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10656 The `append' function attaches one list to another. Thus,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10657
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10658 (append '(1 2 3 4) '(5 6 7 8))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10659
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10660 produces the list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10661
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10662 (1 2 3 4 5 6 7 8)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10663
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10664 This is exactly how we want to attach two lengths' lists produced by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10665 `lengths-list-file' to each other. The results contrast with `cons',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10666
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10667 (cons '(1 2 3 4) '(5 6 7 8))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10668
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10669 which constructs a new list in which the first argument to `cons'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10670 becomes the first element of the new list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10671
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10672 ((1 2 3 4) 5 6 7 8)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10673
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10674 Recursively Count Words in Different Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10675 ==========================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10676
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10677 Besides a `while' loop, you can work on each of a list of files with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10678 recursion. A recursive version of `lengths-list-many-files' is short
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10679 and simple.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10680
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10681 The recursive function has the usual parts: the `do-again-test', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10682 `next-step-expression', and the recursive call. The `do-again-test'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10683 determines whether the function should call itself again, which it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10684 will do if the `list-of-files' contains any remaining elements; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10685 `next-step-expression' resets the `list-of-files' to the CDR of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10686 itself, so eventually the list will be empty; and the recursive call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10687 calls itself on the shorter list. The complete function is shorter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10688 than this description!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10689
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10690 (defun recursive-lengths-list-many-files (list-of-files)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10691 "Return list of lengths of each defun in LIST-OF-FILES."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10692 (if list-of-files ; do-again-test
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10693 (append
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10694 (lengths-list-file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10695 (expand-file-name (car list-of-files)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10696 (recursive-lengths-list-many-files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10697 (cdr list-of-files)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10698
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10699 In a sentence, the function returns the lengths' list for the first of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10700 the `list-of-files' appended to the result of calling itself on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10701 rest of the `list-of-files'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10702
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10703 Here is a test of `recursive-lengths-list-many-files', along with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10704 results of running `lengths-list-file' on each of the files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10705 individually.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10706
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10707 Install `recursive-lengths-list-many-files' and `lengths-list-file',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10708 if necessary, and then evaluate the following expressions. You may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10709 need to change the files' pathnames; those here work when this Info
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10710 file and the Emacs sources are located in their customary places. To
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10711 change the expressions, copy them to the `*scratch*' buffer, edit
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10712 them, and then evaluate them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10713
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10714 The results are shown after the `=>'. (These results are for files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10715 from Emacs Version 21.0.100; files from other versions of Emacs may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10716 produce different results.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10717
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10718 (cd "/usr/local/share/emacs/21.0.100/")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10719
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10720 (lengths-list-file "./lisp/macros.el")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10721 => (273 263 456 90)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10722
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10723 (lengths-list-file "./lisp/mail/mailalias.el")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10724 => (38 32 26 77 174 180 321 198 324)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10725
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10726 (lengths-list-file "./lisp/makesum.el")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10727 => (85 181)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10728
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10729 (recursive-lengths-list-many-files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10730 '("./lisp/macros.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10731 "./lisp/mail/mailalias.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10732 "./lisp/makesum.el"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10733 => (273 263 456 90 38 32 26 77 174 180 321 198 324 85 181)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10734
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10735 The `recursive-lengths-list-many-files' function produces the output
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10736 we want.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10737
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10738 The next step is to prepare the data in the list for display in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10739 graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10741 Prepare the Data for Display in a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10742 =======================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10743
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10744 The `recursive-lengths-list-many-files' function returns a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10745 numbers. Each number records the length of a function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10746 What we need to do now is transform this data into a list of numbers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10747 suitable for generating a graph. The new list will tell how many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10748 functions definitions contain less than 10 words and symbols, how
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10749 many contain between 10 and 19 words and symbols, how many contain
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10750 between 20 and 29 words and symbols, and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10751
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10752 In brief, we need to go through the lengths' list produced by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10753 `recursive-lengths-list-many-files' function and count the number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10754 defuns within each range of lengths, and produce a list of those
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10755 numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10756
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10757 Based on what we have done before, we can readily foresee that it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10758 should not be too hard to write a function that `CDRs' down the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10759 lengths' list, looks at each element, determines which length range it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10760 is in, and increments a counter for that range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10761
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10762 However, before beginning to write such a function, we should consider
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10763 the advantages of sorting the lengths' list first, so the numbers are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10764 ordered from smallest to largest. First, sorting will make it easier
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10765 to count the numbers in each range, since two adjacent numbers will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10766 either be in the same length range or in adjacent ranges. Second, by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10767 inspecting a sorted list, we can discover the highest and lowest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10768 number, and thereby determine the largest and smallest length range
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10769 that we will need.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10770
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10771 Sorting Lists
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10772 -------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10773
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10774 Emacs contains a function to sort lists, called (as you might guess)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10775 `sort'. The `sort' function takes two arguments, the list to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10776 sorted, and a predicate that determines whether the first of two list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10777 elements is "less" than the second.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10778
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10779 As we saw earlier (*note Using the Wrong Type Object as an Argument:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10780 Wrong Type of Argument.), a predicate is a function that determines
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10781 whether some property is true or false. The `sort' function will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10782 reorder a list according to whatever property the predicate uses;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10783 this means that `sort' can be used to sort non-numeric lists by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10784 non-numeric criteria--it can, for example, alphabetize a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10785
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10786 The `<' function is used when sorting a numeric list. For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10787
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10788 (sort '(4 8 21 17 33 7 21 7) '<)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10789
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10790 produces this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10791
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10792 (4 7 7 8 17 21 21 33)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10794 (Note that in this example, both the arguments are quoted so that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10795 symbols are not evaluated before being passed to `sort' as arguments.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10797 Sorting the list returned by the `recursive-lengths-list-many-files'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10798 function is straightforward; it uses the `<' function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10799
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10800 (sort
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10801 (recursive-lengths-list-many-files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10802 '("../lisp/macros.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10803 "../lisp/mailalias.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10804 "../lisp/makesum.el"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10805 '<
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10806
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10807 which produces:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10808
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10809 (85 86 116 122 154 176 179 265)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10810
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10811 (Note that in this example, the first argument to `sort' is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10812 quoted, since the expression must be evaluated so as to produce the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10813 list that is passed to `sort'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10814
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10815 Making a List of Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10816 ----------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10817
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10818 The `recursive-lengths-list-many-files' function requires a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10819 files as its argument. For our test examples, we constructed such a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10820 list by hand; but the Emacs Lisp source directory is too large for us
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10821 to do for that. Instead, we will write a function to do the job for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10822 us. In this function, we will use both a `while' loop and a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10823 recursive call.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10824
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10825 We did not have to write a function like this for older versions of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10826 GNU Emacs, since they placed all the `.el' files in one directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10827 Instead, we were able to use the `directory-files' function, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10828 lists the names of files that match a specified pattern within a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10829 single directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10830
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10831 However, recent versions of Emacs place Emacs Lisp files in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10832 sub-directories of the top level `lisp' directory. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10833 re-arrangement eases navigation. For example, all the mail related
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10834 files are in a `lisp' sub-directory called `mail'. But at the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10835 time, this arrangement forces us to create a file listing function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10836 that descends into the sub-directories.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10838 We can create this function, called `files-in-below-directory', using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10839 familiar functions such as `car', `nthcdr', and `substring' in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10840 conjunction with an existing function called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10841 `directory-files-and-attributes'. This latter function not only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10842 lists all the filenames in a directory, including the names of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10843 sub-directories, but also their attributes.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10844
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10845 To restate our goal: to create a function that will enable us to feed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10846 filenames to `recursive-lengths-list-many-files' as a list that looks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10847 like this (but with more elements):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10848
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10849 ("../lisp/macros.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10850 "../lisp/mail/rmail.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10851 "../lisp/makesum.el")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10852
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10853 The `directory-files-and-attributes' function returns a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10854 lists. Each of the lists within the main list consists of 13
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10855 elements. The first element is a string that contains the name of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10856 file - which, in GNU/Linux, may be a `directory file', that is to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10857 say, a file with the special attributes of a directory. The second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10858 element of the list is `t' for a directory, a string for symbolic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10859 link (the string is the name linked to), or `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10860
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10861 For example, the first `.el' file in the `lisp/' directory is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10862 `abbrev.el'. Its name is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10863 `/usr/local/share/emacs/21.0.100/lisp/abbrev.el' and it is not a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10864 directory or a symbolic link.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10865
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10866 This is how `directory-files-and-attributes' lists that file and its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10867 attributes:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10868
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10869 ("/usr/local/share/emacs/21.0.100/lisp/abbrev.el"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10870 nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10871 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10872 1000
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10873 100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10874 (15019 32380)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10875 (14883 48041)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10876 (15214 49336)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10877 11583
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10878 "-rw-rw-r--"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10879 t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10880 341385
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10881 776)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10883 On the other hand, `mail/' is a directory within the `lisp/'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10884 directory. The beginning of its listing looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10885
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10886 ("/usr/local/share/emacs/21.0.100/lisp/mail"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10887 t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10888 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10889 )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10890
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10891 (Look at the documentation of `file-attributes' to learn about the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10892 different attributes. Bear in mind that the `file-attributes'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10893 function does not list the filename, so its first element is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10894 `directory-files-and-attributes''s second element.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10895
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10896 We will want our new function, `files-in-below-directory', to list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10897 the `.el' files in the directory it is told to check, and in any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10898 directories below that directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10899
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10900 This gives us a hint on how to construct `files-in-below-directory':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10901 within a directory, the function should add `.el' filenames to a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10902 list; and if, within a directory, the function comes upon a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10903 sub-directory, it should go into that sub-directory and repeat its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10904 actions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10905
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10906 However, we should note that every directory contains a name that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10907 refers to itself, called `.', ("dot") and a name that refers to its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10908 parent directory, called `..' ("double dot"). (In `/', the root
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10909 directory, `..' refers to itself, since `/' has no parent.) Clearly,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10910 we do not want our `files-in-below-directory' function to enter those
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10911 directories, since they always lead us, directly or indirectly, to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10912 the current directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10913
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10914 Consequently, our `files-in-below-directory' function must do several
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10915 tasks:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10916
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10917 * Check to see whether it is looking at a filename that ends in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10918 `.el'; and if so, add its name to a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10919
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10920 * Check to see whether it is looking at a filename that is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10921 name of a directory; and if so,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10922
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10923 - Check to see whether it is looking at `.' or `..'; and if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10924 so skip it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10925
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10926 - Or else, go into that directory and repeat the process.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10928 Let's write a function definition to do these tasks. We will use a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10929 `while' loop to move from one filename to another within a directory,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10930 checking what needs to be done; and we will use a recursive call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10931 repeat the actions on each sub-directory. The recursive pattern is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10932 `accumulate' (*note Recursive Pattern: _accumulate_: Accumulate.),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10933 using `append' as the combiner.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10934
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10935 Here is the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10936
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10937 (defun files-in-below-directory (directory)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10938 "List the .el files in DIRECTORY and in its sub-directories."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10939 ;; Although the function will be used non-interactively,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10940 ;; it will be easier to test if we make it interactive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10941 ;; The directory will have a name such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10942 ;; "/usr/local/share/emacs/21.0.100/lisp/"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10943 (interactive "DDirectory name: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10944 (let (el-files-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10945 (current-directory-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10946 (directory-files-and-attributes directory t)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10947 ;; while we are in the current directory
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10948 (while current-directory-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10949 (cond
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10950 ;; check to see whether filename ends in `.el'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10951 ;; and if so, append its name to a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10952 ((equal ".el" (substring (car (car current-directory-list)) -3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10953 (setq el-files-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10954 (cons (car (car current-directory-list)) el-files-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10955 ;; check whether filename is that of a directory
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10956 ((eq t (car (cdr (car current-directory-list))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10957 ;; decide whether to skip or recurse
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10958 (if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10959 (equal (or "." "..")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10960 (substring (car (car current-directory-list)) -1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10961 ;; then do nothing if filename is that of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10962 ;; current directory or parent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10963 ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10964 ;; else descend into the directory and repeat the process
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10965 (setq el-files-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10966 (append
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10967 (files-in-below-directory
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10968 (car (car current-directory-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10969 el-files-list)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10970 ;; move to the next filename in the list; this also
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10971 ;; shortens the list so the while loop eventually comes to an end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10972 (setq current-directory-list (cdr current-directory-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10973 ;; return the filenames
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10974 el-files-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10975
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10976 The `files-in-below-directory' `directory-files' function takes one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10977 argument, the name of a directory.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10978
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10979 Thus, on my system,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10980
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10981 (length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10982 (files-in-below-directory "/usr/local/share/emacs/21.0.100/lisp/"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10983
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10984 tells me that my version 21.0.100 Lisp sources directory contains 754
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10985 `.el' files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10986
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10987 `files-in-below-directory' returns a list in reverse alphabetical
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10988 order. An expression to sort the list in alphabetical order looks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10989 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10990
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10991 (sort
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10992 (files-in-below-directory "/usr/local/share/emacs/21.0.100/lisp/")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10993 'string-lessp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10994
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10995 Counting function definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10996 -----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10997
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10998 Our immediate goal is to generate a list that tells us how many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
10999 function definitions contain fewer than 10 words and symbols, how many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11000 contain between 10 and 19 words and symbols, how many contain between
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11001 20 and 29 words and symbols, and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11002
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11003 With a sorted list of numbers, this is easy: count how many elements
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11004 of the list are smaller than 10, then, after moving past the numbers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11005 just counted, count how many are smaller than 20, then, after moving
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11006 past the numbers just counted, count how many are smaller than 30, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11007 so on. Each of the numbers, 10, 20, 30, 40, and the like, is one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11008 larger than the top of that range. We can call the list of such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11009 numbers the `top-of-ranges' list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11010
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11011 If we wished, we could generate this list automatically, but it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11012 simpler to write a list manually. Here it is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11013
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11014 (defvar top-of-ranges
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11015 '(10 20 30 40 50
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11016 60 70 80 90 100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11017 110 120 130 140 150
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11018 160 170 180 190 200
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11019 210 220 230 240 250
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11020 260 270 280 290 300)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11021 "List specifying ranges for `defuns-per-range'.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11022
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11023 To change the ranges, we edit this list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11024
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11025 Next, we need to write the function that creates the list of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11026 number of definitions within each range. Clearly, this function must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11027 take the `sorted-lengths' and the `top-of-ranges' lists as arguments.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11028
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11029 The `defuns-per-range' function must do two things again and again:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11030 it must count the number of definitions within a range specified by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11031 the current top-of-range value; and it must shift to the next higher
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11032 value in the `top-of-ranges' list after counting the number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11033 definitions in the current range. Since each of these actions is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11034 repetitive, we can use `while' loops for the job. One loop counts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11035 the number of definitions in the range defined by the current
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11036 top-of-range value, and the other loop selects each of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11037 top-of-range values in turn.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11038
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11039 Several entries of the `sorted-lengths' list are counted for each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11040 range; this means that the loop for the `sorted-lengths' list will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11041 inside the loop for the `top-of-ranges' list, like a small gear
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11042 inside a big gear.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11044 The inner loop counts the number of definitions within the range. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11045 is a simple counting loop of the type we have seen before. (*Note A
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11046 loop with an incrementing counter: Incrementing Loop.) The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11047 true-or-false test of the loop tests whether the value from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11048 `sorted-lengths' list is smaller than the current value of the top of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11049 the range. If it is, the function increments the counter and tests
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11050 the next value from the `sorted-lengths' list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11051
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11052 The inner loop looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11053
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11054 (while LENGTH-ELEMENT-SMALLER-THAN-TOP-OF-RANGE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11055 (setq number-within-range (1+ number-within-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11056 (setq sorted-lengths (cdr sorted-lengths)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11057
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11058 The outer loop must start with the lowest value of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11059 `top-of-ranges' list, and then be set to each of the succeeding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11060 higher values in turn. This can be done with a loop like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11062 (while top-of-ranges
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11063 BODY-OF-LOOP...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11064 (setq top-of-ranges (cdr top-of-ranges)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11065
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11066 Put together, the two loops look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11067
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11068 (while top-of-ranges
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11069
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11070 ;; Count the number of elements within the current range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11071 (while LENGTH-ELEMENT-SMALLER-THAN-TOP-OF-RANGE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11072 (setq number-within-range (1+ number-within-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11073 (setq sorted-lengths (cdr sorted-lengths)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11074
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11075 ;; Move to next range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11076 (setq top-of-ranges (cdr top-of-ranges)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11077
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11078 In addition, in each circuit of the outer loop, Emacs should record
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11079 the number of definitions within that range (the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11080 `number-within-range') in a list. We can use `cons' for this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11081 purpose. (*Note `cons': cons.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11082
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11083 The `cons' function works fine, except that the list it constructs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11084 will contain the number of definitions for the highest range at its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11085 beginning and the number of definitions for the lowest range at its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11086 end. This is because `cons' attaches new elements of the list to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11087 beginning of the list, and since the two loops are working their way
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11088 through the lengths' list from the lower end first, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11089 `defuns-per-range-list' will end up largest number first. But we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11090 will want to print our graph with smallest values first and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11091 larger later. The solution is to reverse the order of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11092 `defuns-per-range-list'. We can do this using the `nreverse'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11093 function, which reverses the order of a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11094
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11095 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11096
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11097 (nreverse '(1 2 3 4))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11098
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11099 produces:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11101 (4 3 2 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11102
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11103 Note that the `nreverse' function is "destructive"--that is, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11104 changes the list to which it is applied; this contrasts with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11105 `car' and `cdr' functions, which are non-destructive. In this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11106 we do not want the original `defuns-per-range-list', so it does not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11107 matter that it is destroyed. (The `reverse' function provides a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11108 reversed copy of a list, leaving the original list as is.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11109
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11110 Put all together, the `defuns-per-range' looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11112 (defun defuns-per-range (sorted-lengths top-of-ranges)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11113 "SORTED-LENGTHS defuns in each TOP-OF-RANGES range."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11114 (let ((top-of-range (car top-of-ranges))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11115 (number-within-range 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11116 defuns-per-range-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11117
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11118 ;; Outer loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11119 (while top-of-ranges
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11121 ;; Inner loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11122 (while (and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11123 ;; Need number for numeric test.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11124 (car sorted-lengths)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11125 (< (car sorted-lengths) top-of-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11126
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11127 ;; Count number of definitions within current range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11128 (setq number-within-range (1+ number-within-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11129 (setq sorted-lengths (cdr sorted-lengths)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11130
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11131 ;; Exit inner loop but remain within outer loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11133 (setq defuns-per-range-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11134 (cons number-within-range defuns-per-range-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11135 (setq number-within-range 0) ; Reset count to zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11136
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11137 ;; Move to next range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11138 (setq top-of-ranges (cdr top-of-ranges))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11139 ;; Specify next top of range value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11140 (setq top-of-range (car top-of-ranges)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11141
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11142 ;; Exit outer loop and count the number of defuns larger than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11143 ;; the largest top-of-range value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11144 (setq defuns-per-range-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11145 (cons
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11146 (length sorted-lengths)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11147 defuns-per-range-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11148
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11149 ;; Return a list of the number of definitions within each range,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11150 ;; smallest to largest.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11151 (nreverse defuns-per-range-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11152
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11153 The function is straightforward except for one subtle feature. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11154 true-or-false test of the inner loop looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11155
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11156 (and (car sorted-lengths)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11157 (< (car sorted-lengths) top-of-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11159 instead of like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11160
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11161 (< (car sorted-lengths) top-of-range)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11162
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11163 The purpose of the test is to determine whether the first item in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11164 `sorted-lengths' list is less than the value of the top of the range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11165
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11166 The simple version of the test works fine unless the `sorted-lengths'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11167 list has a `nil' value. In that case, the `(car sorted-lengths)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11168 expression function returns `nil'. The `<' function cannot compare a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11169 number to `nil', which is an empty list, so Emacs signals an error and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11170 stops the function from attempting to continue to execute.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11171
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11172 The `sorted-lengths' list always becomes `nil' when the counter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11173 reaches the end of the list. This means that any attempt to use the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11174 `defuns-per-range' function with the simple version of the test will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11175 fail.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11176
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11177 We solve the problem by using the `(car sorted-lengths)' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11178 in conjunction with the `and' expression. The `(car sorted-lengths)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11179 expression returns a non-`nil' value so long as the list has at least
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11180 one number within it, but returns `nil' if the list is empty. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11181 `and' expression first evaluates the `(car sorted-lengths)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11182 expression, and if it is `nil', returns false _without_ evaluating the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11183 `<' expression. But if the `(car sorted-lengths)' expression returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11184 a non-`nil' value, the `and' expression evaluates the `<' expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11185 and returns that value as the value of the `and' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11186
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11187 This way, we avoid an error. *Note forward-paragraph::, for more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11188 information about `and'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11189
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11190 Here is a short test of the `defuns-per-range' function. First,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11191 evaluate the expression that binds (a shortened) `top-of-ranges' list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11192 to the list of values, then evaluate the expression for binding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11193 `sorted-lengths' list, and then evaluate the `defuns-per-range'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11194 function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11195
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11196 ;; (Shorter list than we will use later.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11197 (setq top-of-ranges
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11198 '(110 120 130 140 150
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11199 160 170 180 190 200))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11200
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11201 (setq sorted-lengths
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11202 '(85 86 110 116 122 129 154 176 179 200 265 300 300))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11203
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11204 (defuns-per-range sorted-lengths top-of-ranges)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11205
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11206 The list returned looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11207
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11208 (2 2 2 0 0 1 0 2 0 0 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11209
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11210 Indeed, there are two elements of the `sorted-lengths' list smaller
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11211 than 110, two elements between 110 and 119, two elements between 120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11212 and 129, and so on. There are four elements with a value of 200 or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11213 larger.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11214
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11215 Readying a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11216 ****************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11217
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11218 Our goal is to construct a graph showing the numbers of function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11219 definitions of various lengths in the Emacs lisp sources.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11220
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11221 As a practical matter, if you were creating a graph, you would
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11222 probably use a program such as `gnuplot' to do the job. (`gnuplot'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11223 is nicely integrated into GNU Emacs.) In this case, however, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11224 create one from scratch, and in the process we will re-acquaint
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11225 ourselves with some of what we learned before and learn more.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11226
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11227 In this chapter, we will first write a simple graph printing function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11228 This first definition will be a "prototype", a rapidly written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11229 function that enables us to reconnoiter this unknown graph-making
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11230 territory. We will discover dragons, or find that they are myth.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11231 After scouting the terrain, we will feel more confident and enhance
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11232 the function to label the axes automatically.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11233
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11234 Printing the Columns of a Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11235 ===============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11236
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11237 Since Emacs is designed to be flexible and work with all kinds of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11238 terminals, including character-only terminals, the graph will need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11239 be made from one of the `typewriter' symbols. An asterisk will do; as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11240 we enhance the graph-printing function, we can make the choice of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11241 symbol a user option.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11242
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11243 We can call this function `graph-body-print'; it will take a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11244 `numbers-list' as its only argument. At this stage, we will not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11245 label the graph, but only print its body.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11246
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11247 The `graph-body-print' function inserts a vertical column of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11248 asterisks for each element in the `numbers-list'. The height of each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11249 line is determined by the value of that element of the `numbers-list'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11250
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11251 Inserting columns is a repetitive act; that means that this function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11252 can be written either with a `while' loop or recursively.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11253
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11254 Our first challenge is to discover how to print a column of asterisks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11255 Usually, in Emacs, we print characters onto a screen horizontally,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11256 line by line, by typing. We have two routes we can follow: write our
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11257 own column-insertion function or discover whether one exists in Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11258
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11259 To see whether there is one in Emacs, we can use the `M-x apropos'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11260 command. This command is like the `C-h a' (command-apropos) command,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11261 except that the latter finds only those functions that are commands.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11262 The `M-x apropos' command lists all symbols that match a regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11263 expression, including functions that are not interactive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11264
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11265 What we want to look for is some command that prints or inserts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11266 columns. Very likely, the name of the function will contain either
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11267 the word `print' or the word `insert' or the word `column'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11268 Therefore, we can simply type `M-x apropos RET print\|insert\|column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11269 RET' and look at the result. On my system, this command takes quite
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11270 some time, and then produces a list of 79 functions and variables.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11271 Scanning down the list, the only function that looks as if it might
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11272 do the job is `insert-rectangle'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11273
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11274 Indeed, this is the function we want; its documentation says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11275
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11276 insert-rectangle:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11277 Insert text of RECTANGLE with upper left corner at point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11278 RECTANGLE's first line is inserted at point,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11279 its second line is inserted at a point vertically under point, etc.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11280 RECTANGLE should be a list of strings.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11281
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11282 We can run a quick test, to make sure it does what we expect of it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11283
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11284 Here is the result of placing the cursor after the `insert-rectangle'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11285 expression and typing `C-u C-x C-e' (`eval-last-sexp'). The function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11286 inserts the strings `"first"', `"second"', and `"third"' at and below
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11287 point. Also the function returns `nil'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11288
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11289 (insert-rectangle '("first" "second" "third"))first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11290 second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11291 third
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11292 nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11293
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11294 Of course, we won't be inserting the text of the `insert-rectangle'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11295 expression itself into the buffer in which we are making the graph,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11296 but will call the function from our program. We shall, however, have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11297 to make sure that point is in the buffer at the place where the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11298 `insert-rectangle' function will insert its column of strings.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11299
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11300 If you are reading this in Info, you can see how this works by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11301 switching to another buffer, such as the `*scratch*' buffer, placing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11302 point somewhere in the buffer, typing `M-:', typing the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11303 `insert-rectangle' expression into the minibuffer at the prompt, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11304 then typing <RET>. This causes Emacs to evaluate the expression in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11305 the minibuffer, but to use as the value of point the position of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11306 point in the `*scratch*' buffer. (`M-:' is the keybinding for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11307 `eval-expression'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11308
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11309 We find when we do this that point ends up at the end of the last
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11310 inserted line--that is to say, this function moves point as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11311 side-effect. If we were to repeat the command, with point at this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11312 position, the next insertion would be below and to the right of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11313 previous insertion. We don't want this! If we are going to make a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11314 bar graph, the columns need to be beside each other.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11315
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11316 So we discover that each cycle of the column-inserting `while' loop
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11317 must reposition point to the place we want it, and that place will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11318 at the top, not the bottom, of the column. Moreover, we remember
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11319 that when we print a graph, we do not expect all the columns to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11320 the same height. This means that the top of each column may be at a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11321 different height from the previous one. We cannot simply reposition
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11322 point to the same line each time, but moved over to the right--or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11323 perhaps we can...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11324
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11325 We are planning to make the columns of the bar graph out of asterisks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11326 The number of asterisks in the column is the number specified by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11327 current element of the `numbers-list'. We need to construct a list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11328 of asterisks of the right length for each call to `insert-rectangle'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11329 If this list consists solely of the requisite number of asterisks,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11330 then we will have position point the right number of lines above the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11331 base for the graph to print correctly. This could be difficult.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11332
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11333 Alternatively, if we can figure out some way to pass
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11334 `insert-rectangle' a list of the same length each time, then we can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11335 place point on the same line each time, but move it over one column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11336 to the right for each new column. If we do this, however, some of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11337 the entries in the list passed to `insert-rectangle' must be blanks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11338 rather than asterisks. For example, if the maximum height of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11339 graph is 5, but the height of the column is 3, then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11340 `insert-rectangle' requires an argument that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11341
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11342 (" " " " "*" "*" "*")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11343
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11344 This last proposal is not so difficult, so long as we can determine
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11345 the column height. There are two ways for us to specify the column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11346 height: we can arbitrarily state what it will be, which would work
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11347 fine for graphs of that height; or we can search through the list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11348 numbers and use the maximum height of the list as the maximum height
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11349 of the graph. If the latter operation were difficult, then the former
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11350 procedure would be easiest, but there is a function built into Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11351 that determines the maximum of its arguments. We can use that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11352 function. The function is called `max' and it returns the largest of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11353 all its arguments, which must be numbers. Thus, for example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11354
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11355 (max 3 4 6 5 7 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11356
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11357 returns 7. (A corresponding function called `min' returns the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11358 smallest of all its arguments.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11359
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11360 However, we cannot simply call `max' on the `numbers-list'; the `max'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11361 function expects numbers as its argument, not a list of numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11362 Thus, the following expression,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11363
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11364 (max '(3 4 6 5 7 3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11365
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11366 produces the following error message;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11367
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11368 Wrong type of argument: number-or-marker-p, (3 4 6 5 7 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11369
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11370 We need a function that passes a list of arguments to a function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11371 This function is `apply'. This function `applies' its first argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11372 (a function) to its remaining arguments, the last of which may be a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11373 list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11374
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11375 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11376
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11377 (apply 'max 3 4 7 3 '(4 8 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11378
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11379 returns 8.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11380
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11381 (Incidentally, I don't know how you would learn of this function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11382 without a book such as this. It is possible to discover other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11383 functions, like `search-forward' or `insert-rectangle', by guessing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11384 at a part of their names and then using `apropos'. Even though its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11385 base in metaphor is clear--`apply' its first argument to the rest--I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11386 doubt a novice would come up with that particular word when using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11387 `apropos' or other aid. Of course, I could be wrong; after all, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11388 function was first named by someone who had to invent it.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11389
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11390 The second and subsequent arguments to `apply' are optional, so we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11391 can use `apply' to call a function and pass the elements of a list to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11392 it, like this, which also returns 8:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11393
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11394 (apply 'max '(4 8 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11395
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11396 This latter way is how we will use `apply'. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11397 `recursive-lengths-list-many-files' function returns a numbers' list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11398 to which we can apply `max' (we could also apply `max' to the sorted
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11399 numbers' list; it does not matter whether the list is sorted or not.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11400
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11401 Hence, the operation for finding the maximum height of the graph is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11402 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11403
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11404 (setq max-graph-height (apply 'max numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11405
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11406 Now we can return to the question of how to create a list of strings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11407 for a column of the graph. Told the maximum height of the graph and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11408 the number of asterisks that should appear in the column, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11409 function should return a list of strings for the `insert-rectangle'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11410 command to insert.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11411
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11412 Each column is made up of asterisks or blanks. Since the function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11413 passed the value of the height of the column and the number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11414 asterisks in the column, the number of blanks can be found by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11415 subtracting the number of asterisks from the height of the column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11416 Given the number of blanks and the number of asterisks, two `while'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11417 loops can be used to construct the list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11418
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11419 ;;; First version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11420 (defun column-of-graph (max-graph-height actual-height)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11421 "Return list of strings that is one column of a graph."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11422 (let ((insert-list nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11423 (number-of-top-blanks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11424 (- max-graph-height actual-height)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11425
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11426 ;; Fill in asterisks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11427 (while (> actual-height 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11428 (setq insert-list (cons "*" insert-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11429 (setq actual-height (1- actual-height)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11430
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11431 ;; Fill in blanks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11432 (while (> number-of-top-blanks 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11433 (setq insert-list (cons " " insert-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11434 (setq number-of-top-blanks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11435 (1- number-of-top-blanks)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11436
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11437 ;; Return whole list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11438 insert-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11440 If you install this function and then evaluate the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11441 expression you will see that it returns the list as desired:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11442
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11443 (column-of-graph 5 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11444
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11445 returns
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11446
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11447 (" " " " "*" "*" "*")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11448
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11449 As written, `column-of-graph' contains a major flaw: the symbols used
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11450 for the blank and for the marked entries in the column are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11451 `hard-coded' as a space and asterisk. This is fine for a prototype,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11452 but you, or another user, may wish to use other symbols. For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11453 in testing the graph function, you many want to use a period in place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11454 of the space, to make sure the point is being repositioned properly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11455 each time the `insert-rectangle' function is called; or you might
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11456 want to substitute a `+' sign or other symbol for the asterisk. You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11457 might even want to make a graph-column that is more than one display
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11458 column wide. The program should be more flexible. The way to do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11459 that is to replace the blank and the asterisk with two variables that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11460 we can call `graph-blank' and `graph-symbol' and define those
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11461 variables separately.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11462
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11463 Also, the documentation is not well written. These considerations
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11464 lead us to the second version of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11465
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11466 (defvar graph-symbol "*"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11467 "String used as symbol in graph, usually an asterisk.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11468
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11469 (defvar graph-blank " "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11470 "String used as blank in graph, usually a blank space.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11471 graph-blank must be the same number of columns wide
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11472 as graph-symbol.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11473
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11474 (For an explanation of `defvar', see *Note Initializing a Variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11475 with `defvar': defvar.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11476
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11477 ;;; Second version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11478 (defun column-of-graph (max-graph-height actual-height)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11479 "Return MAX-GRAPH-HEIGHT strings; ACTUAL-HEIGHT are graph-symbols.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11480 The graph-symbols are contiguous entries at the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11481 of the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11482 The list will be inserted as one column of a graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11483 The strings are either graph-blank or graph-symbol."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11484
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11485 (let ((insert-list nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11486 (number-of-top-blanks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11487 (- max-graph-height actual-height)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11488
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11489 ;; Fill in `graph-symbols'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11490 (while (> actual-height 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11491 (setq insert-list (cons graph-symbol insert-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11492 (setq actual-height (1- actual-height)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11494 ;; Fill in `graph-blanks'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11495 (while (> number-of-top-blanks 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11496 (setq insert-list (cons graph-blank insert-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11497 (setq number-of-top-blanks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11498 (1- number-of-top-blanks)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11499
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11500 ;; Return whole list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11501 insert-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11502
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11503 If we wished, we could rewrite `column-of-graph' a third time to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11504 provide optionally for a line graph as well as for a bar graph. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11505 would not be hard to do. One way to think of a line graph is that it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11506 is no more than a bar graph in which the part of each bar that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11507 below the top is blank. To construct a column for a line graph, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11508 function first constructs a list of blanks that is one shorter than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11509 the value, then it uses `cons' to attach a graph symbol to the list;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11510 then it uses `cons' again to attach the `top blanks' to the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11511
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11512 It is easy to see how to write such a function, but since we don't
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11513 need it, we will not do it. But the job could be done, and if it were
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11514 done, it would be done with `column-of-graph'. Even more important,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11515 it is worth noting that few changes would have to be made anywhere
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11516 else. The enhancement, if we ever wish to make it, is simple.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11517
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11518 Now, finally, we come to our first actual graph printing function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11519 This prints the body of a graph, not the labels for the vertical and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11520 horizontal axes, so we can call this `graph-body-print'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11521
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11522 The `graph-body-print' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11523 ===============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11524
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11525 After our preparation in the preceding section, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11526 `graph-body-print' function is straightforward. The function will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11527 print column after column of asterisks and blanks, using the elements
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11528 of a numbers' list to specify the number of asterisks in each column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11529 This is a repetitive act, which means we can use a decrementing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11530 `while' loop or recursive function for the job. In this section, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11531 will write the definition using a `while' loop.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11532
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11533 The `column-of-graph' function requires the height of the graph as an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11534 argument, so we should determine and record that as a local variable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11535
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11536 This leads us to the following template for the `while' loop version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11537 of this function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11538
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11539 (defun graph-body-print (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11540 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11541 (let ((height ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11542 ...))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11544 (while numbers-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11545 INSERT-COLUMNS-AND-REPOSITION-POINT
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11546 (setq numbers-list (cdr numbers-list)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11547
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11548 We need to fill in the slots of the template.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11549
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11550 Clearly, we can use the `(apply 'max numbers-list)' expression to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11551 determine the height of the graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11552
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11553 The `while' loop will cycle through the `numbers-list' one element at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11554 a time. As it is shortened by the `(setq numbers-list (cdr
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11555 numbers-list))' expression, the CAR of each instance of the list is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11556 the value of the argument for `column-of-graph'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11557
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11558 At each cycle of the `while' loop, the `insert-rectangle' function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11559 inserts the list returned by `column-of-graph'. Since the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11560 `insert-rectangle' function moves point to the lower right of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11561 inserted rectangle, we need to save the location of point at the time
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11562 the rectangle is inserted, move back to that position after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11563 rectangle is inserted, and then move horizontally to the next place
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11564 from which `insert-rectangle' is called.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11565
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11566 If the inserted columns are one character wide, as they will be if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11567 single blanks and asterisks are used, the repositioning command is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11568 simply `(forward-char 1)'; however, the width of a column may be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11569 greater than one. This means that the repositioning command should be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11570 written `(forward-char symbol-width)'. The `symbol-width' itself is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11571 the length of a `graph-blank' and can be found using the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11572 `(length graph-blank)'. The best place to bind the `symbol-width'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11573 variable to the value of the width of graph column is in the varlist
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11574 of the `let' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11575
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11576 These considerations lead to the following function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11577
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11578 (defun graph-body-print (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11579 "Print a bar graph of the NUMBERS-LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11580 The numbers-list consists of the Y-axis values."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11581
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11582 (let ((height (apply 'max numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11583 (symbol-width (length graph-blank))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11584 from-position)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11585
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11586 (while numbers-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11587 (setq from-position (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11588 (insert-rectangle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11589 (column-of-graph height (car numbers-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11590 (goto-char from-position)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11591 (forward-char symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11592 ;; Draw graph column by column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11593 (sit-for 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11594 (setq numbers-list (cdr numbers-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11595 ;; Place point for X axis labels.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11596 (forward-line height)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11597 (insert "\n")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11598 ))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11599
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11600 The one unexpected expression in this function is the `(sit-for 0)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11601 expression in the `while' loop. This expression makes the graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11602 printing operation more interesting to watch than it would be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11603 otherwise. The expression causes Emacs to `sit' or do nothing for a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11604 zero length of time and then redraw the screen. Placed here, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11605 causes Emacs to redraw the screen column by column. Without it,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11606 Emacs would not redraw the screen until the function exits.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11607
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11608 We can test `graph-body-print' with a short list of numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11609
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11610 1. Install `graph-symbol', `graph-blank', `column-of-graph', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11611 are in *Note Columns of a graph::, and `graph-body-print'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11612
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11613 2. Copy the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11614
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11615 (graph-body-print '(1 2 3 4 6 4 3 5 7 6 5 2 3))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11616
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11617 3. Switch to the `*scratch*' buffer and place the cursor where you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11618 want the graph to start.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11619
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11620 4. Type `M-:' (`eval-expression').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11621
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11622 5. Yank the `graph-body-print' expression into the minibuffer with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11623 `C-y' (`yank)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11624
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11625 6. Press <RET> to evaluate the `graph-body-print' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11626
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11627 Emacs will print a graph like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11628
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11629 *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11630 * **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11631 * ****
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11632 *** ****
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11633 ********* *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11634 ************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11635 *************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11636
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11637 The `recursive-graph-body-print' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11638 =========================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11639
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11640 The `graph-body-print' function may also be written recursively. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11641 recursive solution is divided into two parts: an outside `wrapper'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11642 that uses a `let' expression to determine the values of several
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11643 variables that need only be found once, such as the maximum height of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11644 the graph, and an inside function that is called recursively to print
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11645 the graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11646
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11647 The `wrapper' is uncomplicated:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11648
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11649 (defun recursive-graph-body-print (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11650 "Print a bar graph of the NUMBERS-LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11651 The numbers-list consists of the Y-axis values."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11652 (let ((height (apply 'max numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11653 (symbol-width (length graph-blank))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11654 from-position)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11655 (recursive-graph-body-print-internal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11656 numbers-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11657 height
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11658 symbol-width)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11659
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11660 The recursive function is a little more difficult. It has four parts:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11661 the `do-again-test', the printing code, the recursive call, and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11662 `next-step-expression'. The `do-again-test' is an `if' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11663 that determines whether the `numbers-list' contains any remaining
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11664 elements; if it does, the function prints one column of the graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11665 using the printing code and calls itself again. The function calls
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11666 itself again according to the value produced by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11667 `next-step-expression' which causes the call to act on a shorter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11668 version of the `numbers-list'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11669
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11670 (defun recursive-graph-body-print-internal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11671 (numbers-list height symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11672 "Print a bar graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11673 Used within recursive-graph-body-print function."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11674
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11675 (if numbers-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11676 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11677 (setq from-position (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11678 (insert-rectangle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11679 (column-of-graph height (car numbers-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11680 (goto-char from-position)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11681 (forward-char symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11682 (sit-for 0) ; Draw graph column by column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11683 (recursive-graph-body-print-internal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11684 (cdr numbers-list) height symbol-width))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11685
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11686 After installation, this expression can be tested; here is a sample:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11687
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11688 (recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11689
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11690 Here is what `recursive-graph-body-print' produces:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11691
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11692 *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11693 ** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11694 **** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11695 **** ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11696 * *********
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11697 ************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11698 *************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11699
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11700 Either of these two functions, `graph-body-print' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11701 `recursive-graph-body-print', create the body of a graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11702
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11703 Need for Printed Axes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11704 =====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11705
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11706 A graph needs printed axes, so you can orient yourself. For a do-once
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11707 project, it may be reasonable to draw the axes by hand using Emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11708 Picture mode; but a graph drawing function may be used more than once.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11709
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11710 For this reason, I have written enhancements to the basic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11711 `print-graph-body' function that automatically print labels for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11712 horizontal and vertical axes. Since the label printing functions do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11713 not contain much new material, I have placed their description in an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11714 appendix. *Note A Graph with Labelled Axes: Full Graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11715
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11716 Exercise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11717 ========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11718
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11719 Write a line graph version of the graph printing functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11720
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11721 Your `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11722 ******************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11723
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11724 "You don't have to like Emacs to like it" - this seemingly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11725 paradoxical statement is the secret of GNU Emacs. The plain, `out of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11726 the box' Emacs is a generic tool. Most people who use it, customize
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11727 it to suit themselves.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11728
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11729 GNU Emacs is mostly written in Emacs Lisp; this means that by writing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11730 expressions in Emacs Lisp you can change or extend Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11731
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11732 Emacs' Default Configuration
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11733 ============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11734
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11735 There are those who appreciate Emacs' default configuration. After
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11736 all, Emacs starts you in C mode when you edit a C file, starts you in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11737 Fortran mode when you edit a Fortran file, and starts you in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11738 Fundamental mode when you edit an unadorned file. This all makes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11739 sense, if you do not know who is going to use Emacs. Who knows what a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11740 person hopes to do with an unadorned file? Fundamental mode is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11741 right default for such a file, just as C mode is the right default for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11742 editing C code. But when you do know who is going to use Emacs--you,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11743 yourself--then it makes sense to customize Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11744
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11745 For example, I seldom want Fundamental mode when I edit an otherwise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11746 undistinguished file; I want Text mode. This is why I customize
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11747 Emacs: so it suits me.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11748
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11749 You can customize and extend Emacs by writing or adapting a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11750 `~/.emacs' file. This is your personal initialization file; its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11751 contents, written in Emacs Lisp, tell Emacs what to do.(1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11752
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11753 A `~/.emacs' file contains Emacs Lisp code. You can write this code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11754 yourself; or you can use Emacs' `customize' feature to write the code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11755 for you. You can combine your own expressions and auto-written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11756 Customize expressions in your `.emacs' file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11757
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11758 (I myself prefer to write my own expressions, except for those,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11759 particularly fonts, that I find easier to manipulate using the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11760 `customize' command. I combine the two methods.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11761
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11762 Most of this chapter is about writing expressions yourself. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11763 describes a simple `.emacs' file; for more information, see *Note The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11764 Init File: (emacs)Init File, and *Note The Init File: (elisp)Init
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11765 File.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11766
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11767 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11768
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11769 (1) You may also add `.el' to `~/.emacs' and call it a `~/.emacs.el'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11770 file. In the past, you were forbidden to type the extra keystrokes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11771 that the name `~/.emacs.el' requires, but now you may. The new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11772 format is consistent with the Emacs Lisp file naming conventions; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11773 old format saves typing.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11774
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11775 Site-wide Initialization Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11776 ==============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11777
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11778 In addition to your personal initialization file, Emacs automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11779 loads various site-wide initialization files, if they exist. These
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11780 have the same form as your `.emacs' file, but are loaded by everyone.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11781
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11782 Two site-wide initialization files, `site-load.el' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11783 `site-init.el', are loaded into Emacs and then `dumped' if a `dumped'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11784 version of Emacs is created, as is most common. (Dumped copies of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11785 Emacs load more quickly. However, once a file is loaded and dumped,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11786 a change to it does not lead to a change in Emacs unless you load it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11787 yourself or re-dump Emacs. *Note Building Emacs: (elisp)Building
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11788 Emacs, and the `INSTALL' file.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11789
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11790 Three other site-wide initialization files are loaded automatically
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11791 each time you start Emacs, if they exist. These are `site-start.el',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11792 which is loaded _before_ your `.emacs' file, and `default.el', and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11793 the terminal type file, which are both loaded _after_ your `.emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11794 file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11795
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11796 Settings and definitions in your `.emacs' file will overwrite
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11797 conflicting settings and definitions in a `site-start.el' file, if it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11798 exists; but the settings and definitions in a `default.el' or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11799 terminal type file will overwrite those in your `.emacs' file. (You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11800 can prevent interference from a terminal type file by setting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11801 `term-file-prefix' to `nil'. *Note A Simple Extension: Simple
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11802 Extension.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11803
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11804 The `INSTALL' file that comes in the distribution contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11805 descriptions of the `site-init.el' and `site-load.el' files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11806
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11807 The `loadup.el', `startup.el', and `loaddefs.el' files control
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11808 loading. These files are in the `lisp' directory of the Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11809 distribution and are worth perusing.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11810
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11811 The `loaddefs.el' file contains a good many suggestions as to what to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11812 put into your own `.emacs' file, or into a site-wide initialization
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11813 file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11814
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11815 Specifying Variables using `defcustom'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11816 ======================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11817
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11818 You can specify variables using `defcustom' so that you and others
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11819 can then use Emacs' `customize' feature to set their values. (You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11820 cannot use `customize' to write function definitions; but you can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11821 write `defuns' in your `.emacs' file. Indeed, you can write any Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11822 expression in your `.emacs' file.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11823
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11824 The `customize' feature depends on the `defcustom' special form.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11825 Although you can use `defvar' or `setq' for variables that users set,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11826 the `defcustom' special form is designed for the job.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11827
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11828 You can use your knowledge of `defvar' for writing the first three
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11829 arguments for `defcustom'. The first argument to `defcustom' is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11830 name of the variable. The second argument is the variable's initial
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11831 value, if any; and this value is set only if the value has not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11832 already been set. The third argument is the documentation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11833
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11834 The fourth and subsequent arguments to `defcustom' specify types and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11835 options; these are not featured in `defvar'. (These arguments are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11836 optional.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11838 Each of these arguments consists of a keyword followed by a value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11839 Each keyword starts with the character `:'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11840
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11841 For example, the customizable user option variable `text-mode-hook'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11842 looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11843
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11844 (defcustom text-mode-hook nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11845 "Normal hook run when entering Text mode and many related modes."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11846 :type 'hook
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11847 :options '(turn-on-auto-fill flyspell-mode)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11848 :group 'data)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11849
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11850 The name of the variable is `text-mode-hook'; it has no default
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11851 value; and its documentation string tells you what it does.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11852
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11853 The `:type' keyword tells Emacs what kind of data `text-mode-hook'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11854 should be set to and how to display the value in a Customization
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11855 buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11856
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11857 The `:options' keyword specifies a suggested list of values for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11858 variable. Currently, you can use `:options' only for a hook. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11859 list is only a suggestion; it is not exclusive; a person who sets the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11860 variable may set it to other values; the list shown following the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11861 `:options' keyword is intended to offer convenient choices to a user.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11862
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11863 Finally, the `:group' keyword tells the Emacs Customization command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11864 in which group the variable is located. This tells where to find it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11865
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11866 For more information, see *Note Writing Customization Definitions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11867 (elisp)Customization.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11868
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11869 Consider `text-mode-hook' as an example.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11870
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11871 There are two ways to customize this variable. You can use the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11872 customization command or write the appropriate expressions yourself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11873
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11874 Using the customization command, you can type:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11875
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11876 M-x customize
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11877
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11878 and find that the group for editing files of data is called `data'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11879 Enter that group. Text Mode Hook is the first member. You can click
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11880 on its various options to set the values. After you click on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11881 button to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11883 Save for Future Sessions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11884
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11885 Emacs will write an expression into your `.emacs' file. It will look
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11886 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11887
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11888 (custom-set-variables
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11889 ;; custom-set-variables was added by Custom --
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11890 ;; don't edit or cut/paste it!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11891 ;; Your init file should contain only one such instance.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11892 '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11893
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11894 (The `text-mode-hook-identify' function tells
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11895 `toggle-text-mode-auto-fill' which buffers are in Text mode.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11896
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11897 In spite of the warning, you certainly may edit, cut, and paste the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11898 expression! I do all time. The purpose of the warning is to scare
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11899 those who do not know what they are doing, so they do not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11900 inadvertently generate an error.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11901
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11902 The `custom-set-variables' works somewhat differently than a `setq'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11903 While I have never learned the differences, I do modify the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11904 `custom-set-variables' expressions in my `.emacs' file by hand: I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11905 make the changes in what appears to me to be a reasonable manner and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11906 have not had any problems. Others prefer to use the Customization
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11907 command and let Emacs do the work for them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11908
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11909 Another `custom-set-...' function is `custom-set-faces'. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11910 function sets the various font faces. Over time, I have set a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11911 considerable number of faces. Some of the time, I re-set them using
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11912 `customize'; other times, I simply edit the `custom-set-faces'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11913 expression in my `.emacs' file itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11914
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11915 The second way to customize your `text-mode-hook' is to set it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11916 yourself in your `.emacs' file using code that has nothing to do with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11917 the `custom-set-...' functions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11918
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11919 When you do this, and later use `customize', you will see a message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11920 that says
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11921
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11922 this option has been changed outside the customize buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11923
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11924 This message is only a warning. If you click on the button to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11925
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11926 Save for Future Sessions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11928 Emacs will write a `custom-set-...' expression near the end of your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11929 `.emacs' file that will be evaluated after your hand-written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11930 expression. It will, therefore, overrule your hand-written
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11931 expression. No harm will be done. When you do this, however, be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11932 careful to remember which expression is active; if you forget, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11933 may confuse yourself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11934
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11935 So long as you remember where the values are set, you will have no
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11936 trouble. In any event, the values are always set in your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11937 initialization file, which is usually called `.emacs'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11938
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11939 I myself use `customize' for hardly anything. Mostly, I write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11940 expressions myself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11941
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11942 Beginning a `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11943 =========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11944
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11945 When you start Emacs, it loads your `.emacs' file unless you tell it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11946 not to by specifying `-q' on the command line. (The `emacs -q'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11947 command gives you a plain, out-of-the-box Emacs.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11948
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11949 A `.emacs' file contains Lisp expressions. Often, these are no more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11950 than expressions to set values; sometimes they are function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11951 definitions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11952
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11953 *Note The Init File `~/.emacs': (emacs)Init File, for a short
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11954 description of initialization files.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11955
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11956 This chapter goes over some of the same ground, but is a walk among
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11957 extracts from a complete, long-used `.emacs' file--my own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11958
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11959 The first part of the file consists of comments: reminders to myself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11960 By now, of course, I remember these things, but when I started, I did
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11961 not.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11962
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11963 ;;;; Bob's .emacs file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11964 ; Robert J. Chassell
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11965 ; 26 September 1985
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11966
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11967 Look at that date! I started this file a long time ago. I have been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11968 adding to it ever since.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11969
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11970 ; Each section in this file is introduced by a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11971 ; line beginning with four semicolons; and each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11972 ; entry is introduced by a line beginning with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11973 ; three semicolons.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11974
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11975 This describes the usual conventions for comments in Emacs Lisp.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11976 Everything on a line that follows a semicolon is a comment. Two,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11977 three, and four semicolons are used as section and subsection
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11978 markers. (*Note Comments: (elisp)Comments, for more about comments.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11979
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11980 ;;;; The Help Key
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11981 ; Control-h is the help key;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11982 ; after typing control-h, type a letter to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11983 ; indicate the subject about which you want help.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11984 ; For an explanation of the help facility,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11985 ; type control-h two times in a row.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11986
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11987 Just remember: type `C-h' two times for help.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11988
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11989 ; To find out about any mode, type control-h m
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11990 ; while in that mode. For example, to find out
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11991 ; about mail mode, enter mail mode and then type
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11992 ; control-h m.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11993
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11994 `Mode help', as I call this, is very helpful. Usually, it tells you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11995 all you need to know.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11996
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11997 Of course, you don't need to include comments like these in your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11998 `.emacs' file. I included them in mine because I kept forgetting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
11999 about Mode help or the conventions for comments--but I was able to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12000 remember to look here to remind myself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12001
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12002 Text and Auto Fill Mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12003 =======================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12004
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12005 Now we come to the part that `turns on' Text mode and Auto Fill mode.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12006
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12007 ;;; Text mode and Auto Fill mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12008 ; The next three lines put Emacs into Text mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12009 ; and Auto Fill mode, and are for writers who
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12010 ; want to start writing prose rather than code.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12011
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12012 (setq default-major-mode 'text-mode)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12013 (add-hook 'text-mode-hook 'text-mode-hook-identify)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12014 (add-hook 'text-mode-hook 'turn-on-auto-fill)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12015
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12016 Here is the first part of this `.emacs' file that does something
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12017 besides remind a forgetful human!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12018
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12019 The first of the two lines in parentheses tells Emacs to turn on Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12020 mode when you find a file, _unless_ that file should go into some
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12021 other mode, such as C mode.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12022
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12023 When Emacs reads a file, it looks at the extension to the file name,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12024 if any. (The extension is the part that comes after a `.'.) If the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12025 file ends with a `.c' or `.h' extension then Emacs turns on C mode.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12026 Also, Emacs looks at first nonblank line of the file; if the line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12027 says `-*- C -*-', Emacs turns on C mode. Emacs possesses a list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12028 extensions and specifications that it uses automatically. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12029 addition, Emacs looks near the last page for a per-buffer, "local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12030 variables list", if any.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12031
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12032 *Note How Major Modes are Chosen: (emacs)Choosing Modes.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12033
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12034 *Note Local Variables in Files: (emacs)File Variables.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12035
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12036 Now, back to the `.emacs' file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12037
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12038 Here is the line again; how does it work?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12039
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12040 (setq default-major-mode 'text-mode)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12041
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12042 This line is a short, but complete Emacs Lisp expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12044 We are already familiar with `setq'. It sets the following variable,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12045 `default-major-mode', to the subsequent value, which is `text-mode'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12046 The single quote mark before `text-mode' tells Emacs to deal directly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12047 with the `text-mode' variable, not with whatever it might stand for.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12048 *Note Setting the Value of a Variable: set & setq, for a reminder of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12049 how `setq' works. The main point is that there is no difference
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12050 between the procedure you use to set a value in your `.emacs' file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12051 and the procedure you use anywhere else in Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12052
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12053 Here are the next two lines:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12054
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12055 (add-hook 'text-mode-hook 'text-mode-hook-identify)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12056 (add-hook 'text-mode-hook 'turn-on-auto-fill)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12057
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12058 In these two lines, the `add-hook' command first adds
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12059 `text-mode-hook-identify' to the variable called `text-mode-hook' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12060 then adds `turn-on-auto-fill' to the variable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12062 `turn-on-auto-fill' is the name of a program, that, you guessed it!,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12063 turns on Auto Fill mode. `text-mode-hook-identify' is a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12064 that tells `toggle-text-mode-auto-fill' which buffers are in Text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12065 mode.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12066
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12067 Every time Emacs turns on Text mode, Emacs runs the commands `hooked'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12068 onto Text mode. So every time Emacs turns on Text mode, Emacs also
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12069 turns on Auto Fill mode.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12070
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12071 In brief, the first line causes Emacs to enter Text mode when you edit
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12072 a file, unless the file name extension, first non-blank line, or local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12073 variables tell Emacs otherwise.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12074
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12075 Text mode among other actions, sets the syntax table to work
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12076 conveniently for writers. In Text mode, Emacs considers an apostrophe
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12077 as part of a word like a letter; but Emacs does not consider a period
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12078 or a space as part of a word. Thus, `M-f' moves you over `it's'. On
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12079 the other hand, in C mode, `M-f' stops just after the `t' of `it's'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12080
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12081 The second and third lines causes Emacs to turn on Auto Fill mode when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12082 it turns on Text mode. In Auto Fill mode, Emacs automatically breaks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12083 a line that is too wide and brings the excessively wide part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12084 line down to the next line. Emacs breaks lines between words, not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12085 within them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12086
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12087 When Auto Fill mode is turned off, lines continue to the right as you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12088 type them. Depending on how you set the value of `truncate-lines',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12089 the words you type either disappear off the right side of the screen,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12090 or else are shown, in a rather ugly and unreadable manner, as a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12091 continuation line on the screen.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12093 In addition, in this part of my `.emacs' file, I tell the Emacs fill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12094 commands to insert two spaces after a colon:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12095
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12096 (setq colon-double-space t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12097
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12098 Mail Aliases
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12099 ============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12101 Here is a `setq' that `turns on' mail aliases, along with more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12102 reminders.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12103
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12104 ;;; Mail mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12105 ; To enter mail mode, type `C-x m'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12106 ; To enter RMAIL (for reading mail),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12107 ; type `M-x rmail'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12108
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12109 (setq mail-aliases t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12110
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12111 This `setq' command sets the value of the variable `mail-aliases' to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12112 `t'. Since `t' means true, the line says, in effect, "Yes, use mail
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12113 aliases."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12114
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12115 Mail aliases are convenient short names for long email addresses or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12116 for lists of email addresses. The file where you keep your `aliases'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12117 is `~/.mailrc'. You write an alias like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12118
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12119 alias geo george@foobar.wiz.edu
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12121 When you write a message to George, address it to `geo'; the mailer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12122 will automatically expand `geo' to the full address.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12123
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12124 Indent Tabs Mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12125 ================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12126
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12127 By default, Emacs inserts tabs in place of multiple spaces when it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12128 formats a region. (For example, you might indent many lines of text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12129 all at once with the `indent-region' command.) Tabs look fine on a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12130 terminal or with ordinary printing, but they produce badly indented
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12131 output when you use TeX or Texinfo since TeX ignores tabs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12132
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12133 The following turns off Indent Tabs mode:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12134
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12135 ;;; Prevent Extraneous Tabs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12136 (setq-default indent-tabs-mode nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12137
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12138 Note that this line uses `setq-default' rather than the `setq'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12139 command that we have seen before. The `setq-default' command sets
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12140 values only in buffers that do not have their own local values for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12141 the variable.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12142
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12143 *Note Tabs vs. Spaces: (emacs)Just Spaces.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12144
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12145 *Note Local Variables in Files: (emacs)File Variables.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12146
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12147 Some Keybindings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12148 ================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12149
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12150 Now for some personal keybindings:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12151
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12152 ;;; Compare windows
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12153 (global-set-key "\C-cw" 'compare-windows)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12154
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12155 `compare-windows' is a nifty command that compares the text in your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12156 current window with text in the next window. It makes the comparison
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12157 by starting at point in each window, moving over text in each window
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12158 as far as they match. I use this command all the time.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12159
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12160 This also shows how to set a key globally, for all modes.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12162 The command is `global-set-key'. It is followed by the keybinding.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12163 In a `.emacs' file, the keybinding is written as shown: `\C-c' stands
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12164 for `control-c', which means `press the control key and the `c' key
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12165 at the same time'. The `w' means `press the `w' key'. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12166 keybinding is surrounded by double quotation marks. In
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12167 documentation, you would write this as `C-c w'. (If you were binding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12168 a <META> key, such as `M-c', rather than a <CTL> key, you would write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12169 `\M-c'. *Note Rebinding Keys in Your Init File: (emacs)Init
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12170 Rebinding, for details.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12171
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12172 The command invoked by the keys is `compare-windows'. Note that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12173 `compare-windows' is preceded by a single quote; otherwise, Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12174 would first try to evaluate the symbol to determine its value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12175
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12176 These three things, the double quotation marks, the backslash before
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12177 the `C', and the single quote mark are necessary parts of keybinding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12178 that I tend to forget. Fortunately, I have come to remember that I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12179 should look at my existing `.emacs' file, and adapt what is there.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12180
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12181 As for the keybinding itself: `C-c w'. This combines the prefix key,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12182 `C-c', with a single character, in this case, `w'. This set of keys,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12183 `C-c' followed by a single character, is strictly reserved for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12184 individuals' own use. (I call these `own' keys, since these are for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12185 my own use.) You should always be able to create such a keybinding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12186 for your own use without stomping on someone else's keybinding. If
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12187 you ever write an extension to Emacs, please avoid taking any of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12188 these keys for public use. Create a key like `C-c C-w' instead.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12189 Otherwise, we will run out of `own' keys.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12190
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12191 Here is another keybinding, with a comment:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12192
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12193 ;;; Keybinding for `occur'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12194 ; I use occur a lot, so let's bind it to a key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12195 (global-set-key "\C-co" 'occur)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12197 The `occur' command shows all the lines in the current buffer that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12198 contain a match for a regular expression. Matching lines are shown
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12199 in a buffer called `*Occur*'. That buffer serves as a menu to jump
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12200 to occurrences.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12201
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12202 Here is how to unbind a key, so it does not work:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12203
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12204 ;;; Unbind `C-x f'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12205 (global-unset-key "\C-xf")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12206
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12207 There is a reason for this unbinding: I found I inadvertently typed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12208 `C-x f' when I meant to type `C-x C-f'. Rather than find a file, as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12209 I intended, I accidentally set the width for filled text, almost
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12210 always to a width I did not want. Since I hardly ever reset my
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12211 default width, I simply unbound the key.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12213 The following rebinds an existing key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12214
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12215 ;;; Rebind `C-x C-b' for `buffer-menu'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12216 (global-set-key "\C-x\C-b" 'buffer-menu)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12217
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12218 By default, `C-x C-b' runs the `list-buffers' command. This command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12219 lists your buffers in _another_ window. Since I almost always want
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12220 to do something in that window, I prefer the `buffer-menu' command,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12221 which not only lists the buffers, but moves point into that window.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12222
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12223 Keymaps
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12224 =======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12226 Emacs uses "keymaps" to record which keys call which commands. When
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12227 you use `global-set-key' to set the keybinding for a single command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12228 in all parts of Emacs, you are specifying the keybinding in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12229 `current-global-map'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12230
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12231 Specific modes, such as C mode or Text mode, have their own keymaps;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12232 the mode-specific keymaps override the global map that is shared by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12233 all buffers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12234
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12235 The `global-set-key' function binds, or rebinds, the global keymap.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12236 For example, the following binds the key `C-x C-b' to the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12237 `buffer-menu':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12238
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12239 (global-set-key "\C-x\C-b" 'buffer-menu)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12241 Mode-specific keymaps are bound using the `define-key' function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12242 which takes a specific keymap as an argument, as well as the key and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12243 the command. For example, my `.emacs' file contains the following
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12244 expression to bind the `texinfo-insert-@group' command to `C-c C-c g':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12245
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12246 (define-key texinfo-mode-map "\C-c\C-cg" 'texinfo-insert-@group)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12247
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12248 The `texinfo-insert-@group' function itself is a little extension to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12249 Texinfo mode that inserts `@group' into a Texinfo file. I use this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12250 command all the time and prefer to type the three strokes `C-c C-c g'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12251 rather than the six strokes `@ g r o u p'. (`@group' and its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12252 matching `@end group' are commands that keep all enclosed text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12253 together on one page; many multi-line examples in this book are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12254 surrounded by `@group ... @end group'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12255
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12256 Here is the `texinfo-insert-@group' function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12257
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12258 (defun texinfo-insert-@group ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12259 "Insert the string @group in a Texinfo buffer."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12260 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12261 (beginning-of-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12262 (insert "@group\n"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12263
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12264 (Of course, I could have used Abbrev mode to save typing, rather than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12265 write a function to insert a word; but I prefer key strokes consistent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12266 with other Texinfo mode key bindings.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12267
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12268 You will see numerous `define-key' expressions in `loaddefs.el' as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12269 well as in the various mode libraries, such as `cc-mode.el' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12270 `lisp-mode.el'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12271
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12272 *Note Customizing Key Bindings: (emacs)Key Bindings, and *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12273 Keymaps: (elisp)Keymaps, for more information about keymaps.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12274
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12275 Loading Files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12276 =============
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12277
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12278 Many people in the GNU Emacs community have written extensions to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12279 Emacs. As time goes by, these extensions are often included in new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12280 releases. For example, the Calendar and Diary packages are now part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12281 of the standard GNU Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12282
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12283 (Calc, which I consider a vital part of Emacs, would be part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12284 standard distribution except that it was so large it was packaged
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12285 separately and no one has changed that.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12286
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12287 You can use a `load' command to evaluate a complete file and thereby
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12288 install all the functions and variables in the file into Emacs. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12289 example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12290
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12291 (load "~/emacs/slowsplit")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12293 This evaluates, i.e. loads, the `slowsplit.el' file or if it exists,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12294 the faster, byte compiled `slowsplit.elc' file from the `emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12295 sub-directory of your home directory. The file contains the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12296 `split-window-quietly', which John Robinson wrote in 1989.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12297
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12298 The `split-window-quietly' function splits a window with the minimum
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12299 of redisplay. I installed it in 1989 because it worked well with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12300 slow 1200 baud terminals I was then using. Nowadays, I only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12301 occasionally come across such a slow connection, but I continue to use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12302 the function because I like the way it leaves the bottom half of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12303 buffer in the lower of the new windows and the top half in the upper
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12304 window.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12305
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12306 To replace the key binding for the default `split-window-vertically',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12307 you must also unset that key and bind the keys to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12308 `split-window-quietly', like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12309
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12310 (global-unset-key "\C-x2")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12311 (global-set-key "\C-x2" 'split-window-quietly)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12312
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12313 If you load many extensions, as I do, then instead of specifying the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12314 exact location of the extension file, as shown above, you can specify
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12315 that directory as part of Emacs' `load-path'. Then, when Emacs loads
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12316 a file, it will search that directory as well as its default list of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12317 directories. (The default list is specified in `paths.h' when Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12318 is built.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12319
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12320 The following command adds your `~/emacs' directory to the existing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12321 load path:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12322
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12323 ;;; Emacs Load Path
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12324 (setq load-path (cons "~/emacs" load-path))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12325
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12326 Incidentally, `load-library' is an interactive interface to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12327 `load' function. The complete function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12329 (defun load-library (library)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12330 "Load the library named LIBRARY.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12331 This is an interface to the function `load'."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12332 (interactive "sLoad library: ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12333 (load library))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12334
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12335 The name of the function, `load-library', comes from the use of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12336 `library' as a conventional synonym for `file'. The source for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12337 `load-library' command is in the `files.el' library.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12338
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12339 Another interactive command that does a slightly different job is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12340 `load-file'. *Note Libraries of Lisp Code for Emacs: (emacs)Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12341 Libraries, for information on the distinction between `load-library'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12342 and this command.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12343
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12344 Autoloading
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12345 ===========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12346
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12347 Instead of installing a function by loading the file that contains it,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12348 or by evaluating the function definition, you can make the function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12349 available but not actually install it until it is first called. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12350 is called "autoloading".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12351
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12352 When you execute an autoloaded function, Emacs automatically evaluates
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12353 the file that contains the definition, and then calls the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12354
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12355 Emacs starts quicker with autoloaded functions, since their libraries
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12356 are not loaded right away; but you need to wait a moment when you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12357 first use such a function, while its containing file is evaluated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12358
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12359 Rarely used functions are frequently autoloaded. The `loaddefs.el'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12360 library contains hundreds of autoloaded functions, from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12361 `bookmark-set' to `wordstar-mode'. Of course, you may come to use a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12362 `rare' function frequently. When you do, you should load that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12363 function's file with a `load' expression in your `.emacs' file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12364
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12365 In my `.emacs' file for Emacs version 21, I load 12 libraries that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12366 contain functions that would otherwise be autoloaded. (Actually, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12367 would have been better to include these files in my `dumped' Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12368 when I built it, but I forgot. *Note Building Emacs: (elisp)Building
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12369 Emacs, and the `INSTALL' file for more about dumping.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12370
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12371 You may also want to include autoloaded expressions in your `.emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12372 file. `autoload' is a built-in function that takes up to five
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12373 arguments, the final three of which are optional. The first argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12374 is the name of the function to be autoloaded; the second is the name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12375 of the file to be loaded. The third argument is documentation for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12376 function, and the fourth tells whether the function can be called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12377 interactively. The fifth argument tells what type of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12378 object--`autoload' can handle a keymap or macro as well as a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12379 (the default is a function).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12380
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12381 Here is a typical example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12382
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12383 (autoload 'html-helper-mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12384 "html-helper-mode" "Edit HTML documents" t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12385
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12386 (`html-helper-mode' is an alternative to `html-mode', which is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12387 standard part of the distribution).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12388
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12389 This expression autoloads the `html-helper-mode' function. It takes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12390 it from the `html-helper-mode.el' file (or from the byte compiled
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12391 file `html-helper-mode.elc', if it exists.) The file must be located
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12392 in a directory specified by `load-path'. The documentation says that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12393 this is a mode to help you edit documents written in the HyperText
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12394 Markup Language. You can call this mode interactively by typing `M-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12395 html-helper-mode'. (You need to duplicate the function's regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12396 documentation in the autoload expression because the regular function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12397 is not yet loaded, so its documentation is not available.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12398
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12399 *Note Autoload: (elisp)Autoload, for more information.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12400
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12401 A Simple Extension: `line-to-top-of-window'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12402 ===========================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12403
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12404 Here is a simple extension to Emacs that moves the line point is on to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12405 the top of the window. I use this all the time, to make text easier
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12406 to read.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12407
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12408 You can put the following code into a separate file and then load it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12409 from your `.emacs' file, or you can include it within your `.emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12410 file.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12411
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12412 Here is the definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12413
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12414 ;;; Line to top of window;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12415 ;;; replace three keystroke sequence C-u 0 C-l
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12416 (defun line-to-top-of-window ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12417 "Move the line point is on to top of window."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12418 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12419 (recenter 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12420
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12421 Now for the keybinding.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12422
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12423 Nowadays, function keys as well as mouse button events and non-ASCII
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12424 characters are written within square brackets, without quotation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12425 marks. (In Emacs version 18 and before, you had to write different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12426 function key bindings for each different make of terminal.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12427
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12428 I bind `line-to-top-of-window' to my <F6> function key like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12429
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12430 (global-set-key [f6] 'line-to-top-of-window)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12431
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12432 For more information, see *Note Rebinding Keys in Your Init File:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12433 (emacs)Init Rebinding.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12434
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12435 If you run two versions of GNU Emacs, such as versions 20 and 21, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12436 use one `.emacs' file, you can select which code to evaluate with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12437 following conditional:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12438
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12439 (cond
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12440 ((string-equal (number-to-string 20) (substring (emacs-version) 10 12))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12441 ;; evaluate version 20 code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12442 ( ... ))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12443 ((string-equal (number-to-string 21) (substring (emacs-version) 10 12))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12444 ;; evaluate version 21 code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12445 ( ... )))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12446
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12447 For example, in contrast to version 20, version 21 blinks its cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12448 by default. I hate such blinking, as well as some other features in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12449 version 21, so I placed the following in my `.emacs' file(1):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12450
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12451 (if (string-equal "21" (substring (emacs-version) 10 12))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12452 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12453 (blink-cursor-mode 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12454 ;; Insert newline when you press `C-n' (next-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12455 ;; at the end of the buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12456 (setq next-line-add-newlines t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12457 ;; Turn on image viewing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12458 (auto-image-file-mode t)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12459 ;; Turn on menu bar (this bar has text)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12460 ;; (Use numeric argument to turn on)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12461 (menu-bar-mode 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12462 ;; Turn off tool bar (this bar has icons)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12463 ;; (Use numeric argument to turn on)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12464 (tool-bar-mode nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12465 ;; Turn off tooltip mode for tool bar
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12466 ;; (This mode causes icon explanations to pop up)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12467 ;; (Use numeric argument to turn on)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12468 (tooltip-mode nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12469 ;; If tooltips turned on, make tips appear promptly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12470 (setq tooltip-delay 0.1) ; default is one second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12471 ))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12472
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12473 (You will note that instead of typing `(number-to-string 21)', I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12474 decided to save typing and wrote `21' as a string, `"21"', rather
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12475 than convert it from an integer to a string. In this instance, this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12476 expression is better than the longer, but more general
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12477 `(number-to-string 21)'. However, if you do not know ahead of time
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12478 what type of information will be returned, then the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12479 `number-to-string' function will be needed.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12480
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12481 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12482
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12483 (1) When I start instances of Emacs that do not load my `.emacs' file
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12484 or any site file, I also turn off blinking:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12485
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12486 emacs -q --no-site-file -eval '(blink-cursor-mode nil)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12487
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12488 X11 Colors
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12489 ==========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12490
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12491 You can specify colors when you use Emacs with the MIT X Windowing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12492 system.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12493
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12494 I dislike the default colors and specify my own.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12495
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12496 Here are the expressions in my `.emacs' file that set values:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12497
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12498 ;; Set cursor color
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12499 (set-cursor-color "white")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12500
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12501 ;; Set mouse color
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12502 (set-mouse-color "white")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12503
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12504 ;; Set foreground and background
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12505 (set-foreground-color "white")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12506 (set-background-color "darkblue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12507
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12508 ;;; Set highlighting colors for isearch and drag
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12509 (set-face-foreground 'highlight "white")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12510 (set-face-background 'highlight "blue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12511
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12512 (set-face-foreground 'region "cyan")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12513 (set-face-background 'region "blue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12514
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12515 (set-face-foreground 'secondary-selection "skyblue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12516 (set-face-background 'secondary-selection "darkblue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12517
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12518 ;; Set calendar highlighting colors
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12519 (setq calendar-load-hook
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12520 '(lambda ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12521 (set-face-foreground 'diary-face "skyblue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12522 (set-face-background 'holiday-face "slate blue")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12523 (set-face-foreground 'holiday-face "white")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12524
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12525 The various shades of blue soothe my eye and prevent me from seeing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12526 the screen flicker.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12527
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12528 Alternatively, I could have set my specifications in various X
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12529 initialization files. For example, I could set the foreground,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12530 background, cursor, and pointer (i.e., mouse) colors in my
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12531 `~/.Xresources' file like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12532
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12533 Emacs*foreground: white
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12534 Emacs*background: darkblue
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12535 Emacs*cursorColor: white
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12536 Emacs*pointerColor: white
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12537
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12538 In any event, since it is not part of Emacs, I set the root color of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12539 my X window in my `~/.xinitrc' file, like this(1):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12540
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12541 # I use TWM for window manager.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12542 xsetroot -solid Navy -fg white &
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12544 ---------- Footnotes ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12545
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12546 (1) I occasionally run more modern window managers, such as Sawfish
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12547 with GNOME, Enlightenment, SCWM, or KDE; in those cases, I often
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12548 specify an image rather than a plain color.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12549
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12550 Miscellaneous Settings for a `.emacs' File
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12551 ==========================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12552
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12553 Here are a few miscellaneous settings:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12554
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12555 - Set the shape and color of the mouse cursor:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12556 ; Cursor shapes are defined in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12557 ; `/usr/include/X11/cursorfont.h';
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12558 ; for example, the `target' cursor is number 128;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12559 ; the `top_left_arrow' cursor is number 132.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12560
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12561 (let ((mpointer (x-get-resource "*mpointer"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12562 "*emacs*mpointer")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12563 ;; If you have not set your mouse pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12564 ;; then set it, otherwise leave as is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12565 (if (eq mpointer nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12566 (setq mpointer "132")) ; top_left_arrow
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12567 (setq x-pointer-shape (string-to-int mpointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12568 (set-mouse-color "white"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12569
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12570 A Modified Mode Line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12571 ====================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12572
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12573 Finally, a feature I really like: a modified mode line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12574
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12575 When I work over a network, I forget which machine I am using. Also,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12576 I tend to I lose track of where I am, and which line point is on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12577
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12578 So I reset my mode line to look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12579
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12580 -:-- foo.texi rattlesnake:/home/bob/ Line 1 (Texinfo Fill) Top
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12581
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12582 I am visiting a file called `foo.texi', on my machine `rattlesnake'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12583 in my `/home/bob' buffer. I am on line 1, in Texinfo mode, and am at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12584 the top of the buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12585
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12586 My `.emacs' file has a section that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12587
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12588 ;; Set a Mode Line that tells me which machine, which directory,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12589 ;; and which line I am on, plus the other customary information.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12590 (setq default-mode-line-format
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12591 (quote
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12592 (#("-" 0 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12593 (help-echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12594 "mouse-1: select window, mouse-2: delete others ..."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12595 mode-line-mule-info
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12596 mode-line-modified
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12597 mode-line-frame-identification
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12598 " "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12599 mode-line-buffer-identification
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12600 " "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12601 (:eval (substring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12602 (system-name) 0 (string-match "\\..+" (system-name))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12603 ":"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12604 default-directory
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12605 #(" " 0 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12606 (help-echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12607 "mouse-1: select window, mouse-2: delete others ..."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12608 (line-number-mode " Line %l ")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12609 global-mode-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12610 #(" %[(" 0 6
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12611 (help-echo
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12612 "mouse-1: select window, mouse-2: delete others ..."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12613 (:eval (mode-line-mode-name))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12614 mode-line-process
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12615 minor-mode-alist
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12616 #("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12617 ")%] "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12618 (-3 . "%P")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12619 ;; "-%-"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12620 )))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12621
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12622 Here, I redefine the default mode line. Most of the parts are from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12623 the original; but I make a few changes. I set the _default_ mode
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12624 line format so as to permit various modes, such as Info, to override
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12625 it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12626
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12627 Many elements in the list are self-explanatory: `mode-line-modified'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12628 is a variable that tells whether the buffer has been modified,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12629 `mode-name' tells the name of the mode, and so on. However, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12630 format looks complicated because of two features we have not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12631 discussed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12632
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12633 The first string in the mode line is a dash or hyphen, `-'. In the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12634 old days, it would have been specified simply as `"-"'. But
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12635 nowadays, Emacs can add properties to a string, such as highlighting
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12636 or, as in this case, a help feature. If you place your mouse cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12637 over the hyphen, some help information appears (By default, you must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12638 wait one second before the information appears. You can change that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12639 timing by changing the value of `tooltip-delay'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12640
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12641 The new string format has a special syntax:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12642
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12643 #("-" 0 1 (help-echo "mouse-1: select window, ..."))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12644
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12645 The `#(' begins a list. The first element of the list is the string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12646 itself, just one `-'. The second and third elements specify the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12647 range over which the fourth element applies. A range starts _after_
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12648 a character, so a zero means the range starts just before the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12649 character; a 1 means that the range ends just after the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12650 character. The third element is the property for the range. It
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12651 consists of a property list, a property name, in this case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12652 `help-echo', followed by a value, in this case, a string. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12653 second, third, and fourth elements of this new string format can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12654 repeated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12655
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12656 *Note Text Properties in String: (elisp)Text Props and Strings, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12657 see *Note Mode Line Format: (elisp)Mode Line Format, for more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12658 information.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12659
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12660 `mode-line-buffer-identification' displays the current buffer name.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12661 It is a list beginning `(#("%12b" 0 4 ...'. The `#(' begins the list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12662
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12663 The `"%12b"' displays the current buffer name, using the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12664 `buffer-name' function with which we are familiar; the `12' specifies
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12665 the maximum number of characters that will be displayed. When a name
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12666 has fewer characters, whitespace is added to fill out to this number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12667 (Buffer names can and often should be longer than 12 characters;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12668 this length works well in a typical 80 column wide window.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12669
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12670 `:eval' is a new feature in GNU Emacs version 21. It says to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12671 evaluate the following form and use the result as a string to display.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12672 In this case, the expression displays the first component of the full
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12673 system name. The end of the first component is a `.' (`period'), so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12674 I use the `string-match' function to tell me the length of the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12675 component. The substring from the zeroth character to that length is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12676 the name of the machine.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12677
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12678 This is the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12679
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12680 (:eval (substring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12681 (system-name) 0 (string-match "\\..+" (system-name))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12682
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12683 `%[' and `%]' cause a pair of square brackets to appear for each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12684 recursive editing level. `%n' says `Narrow' when narrowing is in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12685 effect. `%P' tells you the percentage of the buffer that is above
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12686 the bottom of the window, or `Top', `Bottom', or `All'. (A lower
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12687 case `p' tell you the percentage above the _top_ of the window.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12688 `%-' inserts enough dashes to fill out the line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12689
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12690 Remember, "You don't have to like Emacs to like it" -- your own Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12691 can have different colors, different commands, and different keys
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12692 than a default Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12693
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12694 On the other hand, if you want to bring up a plain `out of the box'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12695 Emacs, with no customization, type:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12696
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12697 emacs -q
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12698
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12699 This will start an Emacs that does _not_ load your `~/.emacs'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12700 initialization file. A plain, default Emacs. Nothing more.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12701
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12702 Debugging
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12703 *********
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12704
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12705 GNU Emacs has two debuggers, `debug' and `edebug'. The first is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12706 built into the internals of Emacs and is always with you; the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12707 requires that you instrument a function before you can use it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12708
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12709 Both debuggers are described extensively in *Note Debugging Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12710 Programs: (elisp)Debugging. In this chapter, I will walk through a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12711 short example of each.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12712
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12713 `debug'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12714 =======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12715
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12716 Suppose you have written a function definition that is intended to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12717 return the sum of the numbers 1 through a given number. (This is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12718 `triangle' function discussed earlier. *Note Example with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12719 Decrementing Counter: Decrementing Example, for a discussion.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12720
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12721 However, your function definition has a bug. You have mistyped `1='
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12722 for `1-'. Here is the broken definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12723
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12724 (defun triangle-bugged (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12725 "Return sum of numbers 1 through NUMBER inclusive."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12726 (let ((total 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12727 (while (> number 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12728 (setq total (+ total number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12729 (setq number (1= number))) ; Error here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12730 total))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12731
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12732 If you are reading this in Info, you can evaluate this definition in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12733 the normal fashion. You will see `triangle-bugged' appear in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12734 echo area.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12735
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12736 Now evaluate the `triangle-bugged' function with an argument of 4:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12737
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12738 (triangle-bugged 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12739
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12740 In GNU Emacs version 21, you will create and enter a `*Backtrace*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12741 buffer that says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12742
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12743 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12744 Debugger entered--Lisp error: (void-function 1=)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12745 (1= number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12746 (setq number (1= number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12747 (while (> number 0) (setq total (+ total number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12748 (setq number (1= number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12749 (let ((total 0)) (while (> number 0) (setq total ...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12750 (setq number ...)) total)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12751 triangle-bugged(4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12752 eval((triangle-bugged 4))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12753 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12754 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12755 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12756 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12757
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12758 (I have reformatted this example slightly; the debugger does not fold
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12759 long lines. As usual, you can quit the debugger by typing `q' in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12760 `*Backtrace*' buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12761
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12762 In practice, for a bug as simple as this, the `Lisp error' line will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12763 tell you what you need to know to correct the definition. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12764 function `1=' is `void'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12765
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12766 In GNU Emacs 20 and before, you will see:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12767
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12768 Symbol's function definition is void: 1=
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12769
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12770 which has the same meaning as the `*Backtrace*' buffer line in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12771 version 21.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12772
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12773 However, suppose you are not quite certain what is going on? You can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12774 read the complete backtrace.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12775
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12776 In this case, you need to run GNU Emacs 21, which automatically starts
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12777 the debugger that puts you in the `*Backtrace*' buffer; or else, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12778 need to start the debugger manually as described below.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12779
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12780 Read the `*Backtrace*' buffer from the bottom up; it tells you what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12781 Emacs did that led to the error. Emacs made an interactive call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12782 `C-x C-e' (`eval-last-sexp'), which led to the evaluation of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12783 `triangle-bugged' expression. Each line above tells you what the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12784 Lisp interpreter evaluated next.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12785
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12786 The third line from the top of the buffer is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12787
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12788 (setq number (1= number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12789
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12790 Emacs tried to evaluate this expression; in order to do so, it tried
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12791 to evaluate the inner expression shown on the second line from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12792 top:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12794 (1= number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12795
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12796 This is where the error occurred; as the top line says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12797
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12798 Debugger entered--Lisp error: (void-function 1=)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12799
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12800 You can correct the mistake, re-evaluate the function definition, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12801 then run your test again.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12802
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12803 `debug-on-entry'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12804 ================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12805
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12806 GNU Emacs 21 starts the debugger automatically when your function has
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12807 an error. GNU Emacs version 20 and before did not; it simply
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12808 presented you with an error message. You had to start the debugger
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12809 manually.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12810
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12811 You can start the debugger manually for all versions of Emacs; the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12812 advantage is that the debugger runs even if you do not have a bug in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12813 your code. Sometimes your code will be free of bugs!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12814
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12815 You can enter the debugger when you call the function by calling
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12816 `debug-on-entry'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12817
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12818 Type:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12819
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12820 M-x debug-on-entry RET triangle-bugged RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12821
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12822 Now, evaluate the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12823
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12824 (triangle-bugged 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12825
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12826 All versions of Emacs will create a `*Backtrace*' buffer and tell you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12827 that it is beginning to evaluate the `triangle-bugged' function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12828
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12829 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12830 Debugger entered--entering a function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12831 * triangle-bugged(5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12832 eval((triangle-bugged 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12833 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12834 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12835 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12836 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12838 In the `*Backtrace*' buffer, type `d'. Emacs will evaluate the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12839 expression in `triangle-bugged'; the buffer will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12840
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12841 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12842 Debugger entered--beginning evaluation of function call form:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12843 * (let ((total 0)) (while (> number 0) (setq total ...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12844 (setq number ...)) total)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12845 * triangle-bugged(5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12846 eval((triangle-bugged 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12847 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12848 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12849 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12850 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12851
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12852 Now, type `d' again, eight times, slowly. Each time you type `d',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12853 Emacs will evaluate another expression in the function definition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12854
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12855 Eventually, the buffer will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12856
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12857 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12858 Debugger entered--beginning evaluation of function call form:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12859 * (setq number (1= number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12860 * (while (> number 0) (setq total (+ total number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12861 (setq number (1= number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12862 * (let ((total 0)) (while (> number 0) (setq total ...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12863 (setq number ...)) total)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12864 * triangle-bugged(5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12865 eval((triangle-bugged 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12866 eval-last-sexp-1(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12867 eval-last-sexp(nil)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12868 call-interactively(eval-last-sexp)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12869 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12870
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12871 Finally, after you type `d' two more times, Emacs will reach the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12872 error, and the top two lines of the `*Backtrace*' buffer will look
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12873 like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12874
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12875 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12876 Debugger entered--Lisp error: (void-function 1=)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12877 * (1= number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12878 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12879 ---------- Buffer: *Backtrace* ----------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12880
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12881 By typing `d', you were able to step through the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12882
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12883 You can quit a `*Backtrace*' buffer by typing `q' in it; this quits
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12884 the trace, but does not cancel `debug-on-entry'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12885
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12886 To cancel the effect of `debug-on-entry', call
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12887 `cancel-debug-on-entry' and the name of the function, like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12888
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12889 M-x cancel-debug-on-entry RET triangle-bugged RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12890
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12891 (If you are reading this in Info, cancel `debug-on-entry' now.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12892
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12893 `debug-on-quit' and `(debug)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12894 =============================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12895
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12896 In addition to setting `debug-on-error' or calling `debug-on-entry',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12897 there are two other ways to start `debug'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12898
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12899 You can start `debug' whenever you type `C-g' (`keyboard-quit') by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12900 setting the variable `debug-on-quit' to `t'. This is useful for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12901 debugging infinite loops.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12902
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12903 Or, you can insert a line that says `(debug)' into your code where
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12904 you want the debugger to start, like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12905
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12906 (defun triangle-bugged (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12907 "Return sum of numbers 1 through NUMBER inclusive."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12908 (let ((total 0))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12909 (while (> number 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12910 (setq total (+ total number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12911 (debug) ; Start debugger.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12912 (setq number (1= number))) ; Error here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12913 total))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12914
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12915 The `debug' function is described in detail in *Note The Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12916 Debugger: (elisp)Debugger.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12917
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12918 The `edebug' Source Level Debugger
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12919 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12920
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12921 Edebug is a source level debugger. Edebug normally displays the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12922 source of the code you are debugging, with an arrow at the left that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12923 shows which line you are currently executing.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12924
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12925 You can walk through the execution of a function, line by line, or run
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12926 quickly until reaching a "breakpoint" where execution stops.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12928 Edebug is described in *Note Edebug: (elisp)edebug.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12929
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12930 Here is a bugged function definition for `triangle-recursively'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12931 *Note Recursion in place of a counter: Recursive triangle function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12932 for a review of it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12933
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12934 (defun triangle-recursively-bugged (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12935 "Return sum of numbers 1 through NUMBER inclusive.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12936 Uses recursion."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12937 (if (= number 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12938 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12939 (+ number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12940 (triangle-recursively-bugged
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12941 (1= number))))) ; Error here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12942
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12943 Normally, you would install this definition by positioning your cursor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12944 after the function's closing parenthesis and typing `C-x C-e'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12945 (`eval-last-sexp') or else by positioning your cursor within the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12946 definition and typing `C-M-x' (`eval-defun'). (By default, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12947 `eval-defun' command works only in Emacs Lisp mode or in Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12948 Interactive mode.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12949
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12950 However, to prepare this function definition for Edebug, you must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12951 first "instrument" the code using a different command. You can do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12952 this by positioning your cursor within the definition and typing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12953
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12954 M-x edebug-defun RET
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12955
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12956 This will cause Emacs to load Edebug automatically if it is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12957 already loaded, and properly instrument the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12958
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12959 After instrumenting the function, place your cursor after the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12960 following expression and type `C-x C-e' (`eval-last-sexp'):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12961
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12962 (triangle-recursively-bugged 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12963
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12964 You will be jumped back to the source for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12965 `triangle-recursively-bugged' and the cursor positioned at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12966 beginning of the `if' line of the function. Also, you will see an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12967 arrowhead at the left hand side of that line. The arrowhead marks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12968 the line where the function is executing. (In the following examples,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12969 we show the arrowhead with `=>'; in a windowing system, you may see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12970 the arrowhead as a solid triangle in the window `fringe'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12971
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12972 =>-!-(if (= number 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12973
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12974 In the example, the location of point is displayed as `-!-' (in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12975 printed book, it is displayed with a five pointed star).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12976
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12977 If you now press <SPC>, point will move to the next expression to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12978 executed; the line will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12979
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12980 =>(if -!-(= number 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12981
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12982 As you continue to press <SPC>, point will move from expression to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12983 expression. At the same time, whenever an expression returns a value,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12984 that value will be displayed in the echo area. For example, after you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12985 move point past `number', you will see the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12986
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12987 Result: 3 = C-c
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12988
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12989 This means the value of `number' is 3, which is ASCII `control-c'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12990 (the third letter of the alphabet).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12991
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12992 You can continue moving through the code until you reach the line with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12993 the error. Before evaluation, that line looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12994
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12995 => -!-(1= number))))) ; Error here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12996
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12997 When you press <SPC> once again, you will produce an error message
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12998 that says:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
12999
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13000 Symbol's function definition is void: 1=
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13001
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13002 This is the bug.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13003
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13004 Press `q' to quit Edebug.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13006 To remove instrumentation from a function definition, simply
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13007 re-evaluate it with a command that does not instrument it. For
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13008 example, you could place your cursor after the definition's closing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13009 parenthesis and type `C-x C-e'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13010
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13011 Edebug does a great deal more than walk with you through a function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13012 You can set it so it races through on its own, stopping only at an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13013 error or at specified stopping points; you can cause it to display the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13014 changing values of various expressions; you can find out how many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13015 times a function is called, and more.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13016
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13017 Edebug is described in *Note Edebug: (elisp)edebug.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13018
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13019 Debugging Exercises
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13020 ===================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13021
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13022 * Install the `count-words-region' function and then cause it to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13023 enter the built-in debugger when you call it. Run the command
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13024 on a region containing two words. You will need to press `d' a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13025 remarkable number of times. On your system, is a `hook' called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13026 after the command finishes? (For information on hooks, see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13027 *Note Command Loop Overview: (elisp)Command Overview.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13028
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13029 * Copy `count-words-region' into the `*scratch*' buffer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13030 instrument the function for Edebug, and walk through its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13031 execution. The function does not need to have a bug, although
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13032 you can introduce one if you wish. If the function lacks a bug,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13033 the walk-through completes without problems.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13034
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13035 * While running Edebug, type `?' to see a list of all the Edebug
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13036 commands. (The `global-edebug-prefix' is usually `C-x X', i.e.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13037 `<CTL>-x' followed by an upper case `X'; use this prefix for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13038 commands made outside of the Edebug debugging buffer.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13039
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13040 * In the Edebug debugging buffer, use the `p'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13041 (`edebug-bounce-point') command to see where in the region the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13042 `count-words-region' is working.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13044 * Move point to some spot further down function and then type the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13045 `h' (`edebug-goto-here') command to jump to that location.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13046
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13047 * Use the `t' (`edebug-trace-mode') command to cause Edebug to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13048 walk through the function on its own; use an upper case `T' for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13049 `edebug-Trace-fast-mode'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13050
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13051 * Set a breakpoint, then run Edebug in Trace mode until it reaches
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13052 the stopping point.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13053
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13054 Conclusion
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13055 **********
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13056
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13057 We have now reached the end of this Introduction. You have now
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13058 learned enough about programming in Emacs Lisp to set values, to write
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13059 simple `.emacs' files for yourself and your friends, and write simple
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13060 customizations and extensions to Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13061
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13062 This is a place to stop. Or, if you wish, you can now go onward, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13063 teach yourself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13064
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13065 You have learned some of the basic nuts and bolts of programming. But
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13066 only some. There are a great many more brackets and hinges that are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13067 easy to use that we have not touched.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13068
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13069 A path you can follow right now lies among the sources to GNU Emacs
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13070 and in *Note The GNU Emacs Lisp Reference Manual: (elisp)Top.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13072 The Emacs Lisp sources are an adventure. When you read the sources
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13073 and come across a function or expression that is unfamiliar, you need
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13074 to figure out or find out what it does.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13075
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13076 Go to the Reference Manual. It is a thorough, complete, and fairly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13077 easy-to-read description of Emacs Lisp. It is written not only for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13078 experts, but for people who know what you know. (The `Reference
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13079 Manual' comes with the standard GNU Emacs distribution. Like this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13080 introduction, it comes as a Texinfo source file, so you can read it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13081 on-line and as a typeset, printed book.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13082
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13083 Go to the other on-line help that is part of GNU Emacs: the on-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13084 documentation for all functions, and `find-tags', the program that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13085 takes you to sources.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13086
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13087 Here is an example of how I explore the sources. Because of its name,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13088 `simple.el' is the file I looked at first, a long time ago. As it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13089 happens some of the functions in `simple.el' are complicated, or at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13090 least look complicated at first sight. The `open-line' function, for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13091 example, looks complicated.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13093 You may want to walk through this function slowly, as we did with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13094 `forward-sentence' function. (*Note forward-sentence::.) Or you may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13095 want to skip that function and look at another, such as `split-line'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13096 You don't need to read all the functions. According to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13097 `count-words-in-defun', the `split-line' function contains 27 words
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13098 and symbols.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13099
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13100 Even though it is short, `split-line' contains four expressions we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13101 have not studied: `skip-chars-forward', `indent-to', `current-column'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13102 and `?\n'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13103
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13104 Consider the `skip-chars-forward' function. (It is part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13105 function definition for `back-to-indentation', which is shown in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13106 *Note Review: Review.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13107
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13108 In GNU Emacs, you can find out more about `skip-chars-forward' by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13109 typing `C-h f' (`describe-function') and the name of the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13110 This gives you the function documentation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13112 You may be able to guess what is done by a well named function such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13113 `indent-to'; or you can look it up, too. Incidentally, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13114 `describe-function' function itself is in `help.el'; it is one of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13115 those long, but decipherable functions. You can look up
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13116 `describe-function' using the `C-h f' command!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13117
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13118 In this instance, since the code is Lisp, the `*Help*' buffer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13119 contains the name of the library containing the function's source.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13120 You can put point over the name of the library and press the RET key,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13121 which in this situation is bound to `help-follow', and be taken
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13122 directly to the source, in the same way as `M-.' (`find-tag').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13123
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13124 The definition for `describe-function' illustrates how to customize
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13125 the `interactive' expression without using the standard character
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13126 codes; and it shows how to create a temporary buffer.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13127
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13128 (The `indent-to' function is written in C rather than Emacs Lisp; it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13129 is a `built-in' function. `help-follow' only provides you with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13130 documentation of a built-in function; it does not take you to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13131 source. But `find-tag' will take you to the source, if properly set
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13132 up.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13133
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13134 You can look at a function's source using `find-tag', which is bound
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13135 to `M-.' Finally, you can find out what the Reference Manual has to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13136 say by visiting the manual in Info, and typing `i' (`Info-index') and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13137 the name of the function, or by looking up `skip-chars-forward' in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13138 the index to a printed copy of the manual.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13139
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13140 Similarly, you can find out what is meant by `?\n'. You can try
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13141 using `Info-index' with `?\n'. It turns out that this action won't
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13142 help; but don't give up. If you search the index for `\n' without
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13143 the `?', you will be taken directly to the relevant section of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13144 manual. (*Note Character Type: (elisp)Character Type. `?\n' stands
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13145 for the newline character.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13146
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13147 Other interesting source files include `paragraphs.el',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13148 `loaddefs.el', and `loadup.el'. The `paragraphs.el' file includes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13149 short, easily understood functions as well as longer ones. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13150 `loaddefs.el' file contains the many standard autoloads and many
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13151 keymaps. I have never looked at it all; only at parts. `loadup.el'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13152 is the file that loads the standard parts of Emacs; it tells you a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13153 great deal about how Emacs is built. (*Note Building Emacs:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13154 (elisp)Building Emacs, for more about building.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13155
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13156 As I said, you have learned some nuts and bolts; however, and very
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13157 importantly, we have hardly touched major aspects of programming; I
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13158 have said nothing about how to sort information, except to use the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13159 predefined `sort' function; I have said nothing about how to store
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13160 information, except to use variables and lists; I have said nothing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13161 about how to write programs that write programs. These are topics for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13162 another, and different kind of book, a different kind of learning.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13163
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13164 What you have done is learn enough for much practical work with GNU
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13165 Emacs. What you have done is get started. This is the end of a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13166 beginning.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13167
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13168 The `the-the' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13169 **********************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13170
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13171 Sometimes when you you write text, you duplicate words--as with "you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13172 you" near the beginning of this sentence. I find that most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13173 frequently, I duplicate "the'; hence, I call the function for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13174 detecting duplicated words, `the-the'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13175
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13176 As a first step, you could use the following regular expression to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13177 search for duplicates:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13178
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13179 \\(\\w+[ \t\n]+\\)\\1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13180
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13181 This regexp matches one or more word-constituent characters followed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13182 by one or more spaces, tabs, or newlines. However, it does not detect
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13183 duplicated words on different lines, since the ending of the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13184 word, the end of the line, is different from the ending of the second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13185 word, a space. (For more information about regular expressions, see
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13186 *Note Regular Expression Searches: Regexp Search, as well as *Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13187 Syntax of Regular Expressions: (emacs)Regexps, and *Note Regular
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13188 Expressions: (elisp)Regular Expressions.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13189
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13190 You might try searching just for duplicated word-constituent
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13191 characters but that does not work since the pattern detects doubles
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13192 such as the two occurrences of `th' in `with the'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13193
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13194 Another possible regexp searches for word-constituent characters
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13195 followed by non-word-constituent characters, reduplicated. Here,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13196 `\\w+' matches one or more word-constituent characters and `\\W*'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13197 matches zero or more non-word-constituent characters.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13198
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13199 \\(\\(\\w+\\)\\W*\\)\\1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13200
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13201 Again, not useful.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13202
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13203 Here is the pattern that I use. It is not perfect, but good enough.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13204 `\\b' matches the empty string, provided it is at the beginning or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13205 end of a word; `[^@ \n\t]+' matches one or more occurrences of any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13206 characters that are _not_ an @-sign, space, newline, or tab.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13207
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13208 \\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13209
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13210 One can write more complicated expressions, but I found that this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13211 expression is good enough, so I use it.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13212
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13213 Here is the `the-the' function, as I include it in my `.emacs' file,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13214 along with a handy global key binding:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13215
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13216 (defun the-the ()
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13217 "Search forward for for a duplicated word."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13218 (interactive)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13219 (message "Searching for for duplicated words ...")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13220 (push-mark)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13221 ;; This regexp is not perfect
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13222 ;; but is fairly good over all:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13223 (if (re-search-forward
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13224 "\\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b" nil 'move)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13225 (message "Found duplicated word.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13226 (message "End of buffer")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13227
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13228 ;; Bind `the-the' to C-c \
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13229 (global-set-key "\C-c\\" 'the-the)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13230
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13231
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13232 Here is test text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13233
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13234 one two two three four five
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13235 five six seven
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13236
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13237 You can substitute the other regular expressions shown above in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13238 function definition and try each of them on this list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13239
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13240 Handling the Kill Ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13241 **********************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13242
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13243 The kill ring is a list that is transformed into a ring by the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13244 workings of the `rotate-yank-pointer' function. The `yank' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13245 `yank-pop' commands use the `rotate-yank-pointer' function. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13246 appendix describes the `rotate-yank-pointer' function as well as both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13247 the `yank' and the `yank-pop' commands.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13248
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13249 The `rotate-yank-pointer' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13250 ==================================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13251
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13252 The `rotate-yank-pointer' function changes the element in the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13253 ring to which `kill-ring-yank-pointer' points. For example, it can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13254 change `kill-ring-yank-pointer' from pointing to the second element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13255 to point to the third element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13256
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13257 Here is the code for `rotate-yank-pointer':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13258
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13259 (defun rotate-yank-pointer (arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13260 "Rotate the yanking point in the kill ring."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13261 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13262 (let ((length (length kill-ring)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13263 (if (zerop length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13264 ;; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13265 (error "Kill ring is empty")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13266 ;; else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13267 (setq kill-ring-yank-pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13268 (nthcdr (% (+ arg
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13269 (- length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13270 (length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13271 kill-ring-yank-pointer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13272 length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13273 kill-ring)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13274
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13275 `rotate-yank-pointer' in Outline
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13276 --------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13277
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13278 The `rotate-yank-pointer' function looks complex, but as usual, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13279 can be understood by taking it apart piece by piece. First look at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13280 it in skeletal form:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13281
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13282 (defun rotate-yank-pointer (arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13283 "Rotate the yanking point in the kill ring."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13284 (interactive "p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13285 (let VARLIST
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13286 BODY...)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13287
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13288 This function takes one argument, called `arg'. It has a brief
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13289 documentation string; and it is interactive with a small `p', which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13290 means that the argument must be a processed prefix passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13291 function as a number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13293 The body of the function definition is a `let' expression, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13294 itself has a body as well as a VARLIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13295
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13296 The `let' expression declares a variable that will be only usable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13297 within the bounds of this function. This variable is called `length'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13298 and is bound to a value that is equal to the number of items in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13299 kill ring. This is done by using the function called `length'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13300 (Note that this function has the same name as the variable called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13301 `length'; but one use of the word is to name the function and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13302 other is to name the variable. The two are quite distinct.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13303 Similarly, an English speaker will distinguish between the meanings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13304 of the word `ship' when he says: "I must ship this package
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13305 immediately." and "I must get aboard the ship immediately.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13306
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13307 The function `length' tells the number of items there are in a list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13308 so `(length kill-ring)' returns the number of items there are in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13309 kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13310
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13311 The Body of `rotate-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13312 ---------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13313
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13314 The body of `rotate-yank-pointer' is a `let' expression and the body
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13315 of the `let' expression is an `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13316
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13317 The purpose of the `if' expression is to find out whether there is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13318 anything in the kill ring. If the kill ring is empty, the `error'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13319 function stops evaluation of the function and prints a message in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13320 echo area. On the other hand, if the kill ring has something in it,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13321 the work of the function is done.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13322
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13323 Here is the if-part and then-part of the `if' expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13324
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13325 (if (zerop length) ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13326 (error "Kill ring is empty") ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13327 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13329 If there is not anything in the kill ring, its length must be zero and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13330 an error message sent to the user: `Kill ring is empty'. The `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13331 expression uses the function `zerop' which returns true if the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13332 it is testing is zero. When `zerop' tests true, the then-part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13333 `if' is evaluated. The then-part is a list starting with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13334 function `error', which is a function that is similar to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13335 `message' function (*note message::), in that it prints a one-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13336 message in the echo area. However, in addition to printing a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13337 message, `error' also stops evaluation of the function within which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13338 it is embedded. This means that the rest of the function will not be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13339 evaluated if the length of the kill ring is zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13340
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13341 Digression about the word `error'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13342 .................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13343
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13344 (In my opinion, it is slightly misleading, at least to humans, to use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13345 the term `error' as the name of the `error' function. A better term
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13346 would be `cancel'. Strictly speaking, of course, you cannot point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13347 to, much less rotate a pointer to a list that has no length, so from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13348 the point of view of the computer, the word `error' is correct. But
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13349 a human expects to attempt this sort of thing, if only to find out
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13350 whether the kill ring is full or empty. This is an act of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13351 exploration.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13352
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13353 (From the human point of view, the act of exploration and discovery is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13354 not necessarily an error, and therefore should not be labelled as one,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13355 even in the bowels of a computer. As it is, the code in Emacs implies
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13356 that a human who is acting virtuously, by exploring his or her
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13357 environment, is making an error. This is bad. Even though the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13358 computer takes the same steps as it does when there is an `error', a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13359 term such as `cancel' would have a clearer connotation.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13360
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13361 The else-part of the `if' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13362 ....................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13363
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13364 The else-part of the `if' expression is dedicated to setting the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13365 value of `kill-ring-yank-pointer' when the kill ring has something in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13366 it. The code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13367
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13368 (setq kill-ring-yank-pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13369 (nthcdr (% (+ arg
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13370 (- length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13371 (length kill-ring-yank-pointer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13372 length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13373 kill-ring)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13374
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13375 This needs some examination. Clearly, `kill-ring-yank-pointer' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13376 being set to be equal to some CDR of the kill ring, using the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13377 `nthcdr' function that is described in an earlier section. (*Note
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13378 copy-region-as-kill::.) But exactly how does it do this?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13379
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13380 Before looking at the details of the code let's first consider the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13381 purpose of the `rotate-yank-pointer' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13382
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13383 The `rotate-yank-pointer' function changes what
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13384 `kill-ring-yank-pointer' points to. If `kill-ring-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13385 starts by pointing to the first element of a list, a call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13386 `rotate-yank-pointer' causes it to point to the second element; and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13387 if `kill-ring-yank-pointer' points to the second element, a call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13388 `rotate-yank-pointer' causes it to point to the third element. (And
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13389 if `rotate-yank-pointer' is given an argument greater than 1, it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13390 jumps the pointer that many elements.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13391
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13392 The `rotate-yank-pointer' function uses `setq' to reset what the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13393 `kill-ring-yank-pointer' points to. If `kill-ring-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13394 points to the first element of the kill ring, then, in the simplest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13395 case, the `rotate-yank-pointer' function must cause it to point to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13396 the second element. Put another way, `kill-ring-yank-pointer' must
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13397 be reset to have a value equal to the CDR of the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13398
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13399 That is, under these circumstances,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13400
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13401 (setq kill-ring-yank-pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13402 ("some text" "a different piece of text" "yet more text"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13403
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13404 (setq kill-ring
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13405 ("some text" "a different piece of text" "yet more text"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13406
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13407 the code should do this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13408
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13409 (setq kill-ring-yank-pointer (cdr kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13410
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13411 As a result, the `kill-ring-yank-pointer' will look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13412
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13413 kill-ring-yank-pointer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13414 => ("a different piece of text" "yet more text"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13415
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13416 The actual `setq' expression uses the `nthcdr' function to do the job.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13417
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13418 As we have seen before (*note nthcdr::), the `nthcdr' function works
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13419 by repeatedly taking the CDR of a list--it takes the CDR of the CDR
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13420 of the CDR ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13421
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13422 The two following expressions produce the same result:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13423
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13424 (setq kill-ring-yank-pointer (cdr kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13425
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13426 (setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13427
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13428 In the `rotate-yank-pointer' function, however, the first argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13429 `nthcdr' is a rather complex looking expression with lots of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13430 arithmetic inside of it:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13431
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13432 (% (+ arg
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13433 (- length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13434 (length kill-ring-yank-pointer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13435 length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13436
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13437 As usual, we need to look at the most deeply embedded expression first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13438 and then work our way towards the light.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13440 The most deeply embedded expression is `(length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13441 kill-ring-yank-pointer)'. This finds the length of the current value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13442 of the `kill-ring-yank-pointer'. (Remember that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13443 `kill-ring-yank-pointer' is the name of a variable whose value is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13444 list.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13445
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13446 The measurement of the length is inside the expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13447
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13448 (- length (length kill-ring-yank-pointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13449
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13450 In this expression, the first `length' is the variable that was
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13451 assigned the length of the kill ring in the `let' statement at the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13452 beginning of the function. (One might think this function would be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13453 clearer if the variable `length' were named `length-of-kill-ring'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13454 instead; but if you look at the text of the whole function, you will
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13455 see that it is so short that naming this variable `length' is not a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13456 bother, unless you are pulling the function apart into very tiny
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13457 pieces as we are doing here.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13458
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13459 So the line `(- length (length kill-ring-yank-pointer))' tells the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13460 difference between the length of the kill ring and the length of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13461 list whose name is `kill-ring-yank-pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13462
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13463 To see how all this fits into the `rotate-yank-pointer' function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13464 let's begin by analyzing the case where `kill-ring-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13465 points to the first element of the kill ring, just as `kill-ring'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13466 does, and see what happens when `rotate-yank-pointer' is called with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13467 an argument of 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13468
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13469 The variable `length' and the value of the expression `(length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13470 kill-ring-yank-pointer)' will be the same since the variable `length'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13471 is the length of the kill ring and the `kill-ring-yank-pointer' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13472 pointing to the whole kill ring. Consequently, the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13473
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13474 (- length (length kill-ring-yank-pointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13475
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13476 will be zero. Since the value of `arg' will be 1, this will mean
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13477 that the value of the whole expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13478
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13479 (+ arg (- length (length kill-ring-yank-pointer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13480
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13481 will be 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13482
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13483 Consequently, the argument to `nthcdr' will be found as the result of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13484 the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13485
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13486 (% 1 length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13487
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13488 The `%' remainder function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13489 ..........................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13490
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13491 To understand `(% 1 length)', we need to understand `%'. According
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13492 to its documentation (which I just found by typing `C-h f % <RET>'),
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13493 the `%' function returns the remainder of its first argument divided
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13494 by its second argument. For example, the remainder of 5 divided by 2
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13495 is 1. (2 goes into 5 twice with a remainder of 1.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13496
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13497 What surprises people who don't often do arithmetic is that a smaller
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13498 number can be divided by a larger number and have a remainder. In the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13499 example we just used, 5 was divided by 2. We can reverse that and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13500 ask, what is the result of dividing 2 by 5? If you can use
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13501 fractions, the answer is obviously 2/5 or .4; but if, as here, you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13502 can only use whole numbers, the result has to be something different.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13503 Clearly, 5 can go into 2 zero times, but what of the remainder? To
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13504 see what the answer is, consider a case that has to be familiar from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13505 childhood:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13506
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13507 * 5 divided by 5 is 1 with a remainder of 0;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13508
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13509 * 6 divided by 5 is 1 with a remainder of 1;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13510
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13511 * 7 divided by 5 is 1 with a remainder of 2.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13512
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13513 * Similarly, 10 divided by 5 is 2 with a remainder of 0;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13514
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13515 * 11 divided by 5 is 2 with a remainder of 1;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13516
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13517 * 12 divided by 5 is 1 with a remainder of 2.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13518
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13519 By considering the cases as parallel, we can see that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13520
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13521 * zero divided by 5 must be zero with a remainder of zero;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13522
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13523 * 1 divided by 5 must be zero with a remainder of 1;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13524
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13525 * 2 divided by 5 must be zero with a remainder of 2;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13526
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13527 and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13528
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13529 So, in this code, if the value of `length' is 5, then the result of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13530 evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13531
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13532 (% 1 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13533
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13534 is 1. (I just checked this by placing the cursor after the expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13535 and typing `C-x C-e'. Indeed, 1 is printed in the echo area.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13536
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13537 Using `%' in `rotate-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13538 ..................................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13539
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13540 When the `kill-ring-yank-pointer' points to the beginning of the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13541 ring, and the argument passed to `rotate-yank-pointer' is 1, the `%'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13542 expression returns 1:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13543
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13544 (- length (length kill-ring-yank-pointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13545 => 0
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13546
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13547 therefore,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13548
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13549 (+ arg (- length (length kill-ring-yank-pointer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13550 => 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13551
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13552 and consequently:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13553
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13554 (% (+ arg (- length (length kill-ring-yank-pointer)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13555 length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13556 => 1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13557
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13558 regardless of the value of `length'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13559
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13560 As a result of this, the `setq kill-ring-yank-pointer' expression
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13561 simplifies to:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13562
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13563 (setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13564
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13565 What it does is now easy to understand. Instead of pointing as it did
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13566 to the first element of the kill ring, the `kill-ring-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13567 is set to point to the second element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13568
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13569 Clearly, if the argument passed to `rotate-yank-pointer' is two, then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13570 the `kill-ring-yank-pointer' is set to `(nthcdr 2 kill-ring)'; and so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13571 on for different values of the argument.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13572
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13573 Similarly, if the `kill-ring-yank-pointer' starts out pointing to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13574 second element of the kill ring, its length is shorter than the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13575 length of the kill ring by 1, so the computation of the remainder is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13576 based on the expression `(% (+ arg 1) length)'. This means that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13577 `kill-ring-yank-pointer' is moved from the second element of the kill
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13578 ring to the third element if the argument passed to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13579 `rotate-yank-pointer' is 1.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13580
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13581 Pointing to the last element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13582 ............................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13583
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13584 The final question is, what happens if the `kill-ring-yank-pointer'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13585 is set to the _last_ element of the kill ring? Will a call to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13586 `rotate-yank-pointer' mean that nothing more can be taken from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13587 kill ring? The answer is no. What happens is different and useful.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13588 The `kill-ring-yank-pointer' is set to point to the beginning of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13589 kill ring instead.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13590
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13591 Let's see how this works by looking at the code, assuming the length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13592 of the kill ring is 5 and the argument passed to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13593 `rotate-yank-pointer' is 1. When the `kill-ring-yank-pointer' points
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13594 to the last element of the kill ring, its length is 1. The code
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13595 looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13596
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13597 (% (+ arg (- length (length kill-ring-yank-pointer))) length)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13598
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13599 When the variables are replaced by their numeric values, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13600 expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13601
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13602 (% (+ 1 (- 5 1)) 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13603
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13604 This expression can be evaluated by looking at the most embedded inner
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13605 expression first and working outwards: The value of `(- 5 1)' is 4;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13606 the sum of `(+ 1 4)' is 5; and the remainder of dividing 5 by 5 is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13607 zero. So what `rotate-yank-pointer' will do is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13608
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13609 (setq kill-ring-yank-pointer (nthcdr 0 kill-ring))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13610
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13611 which will set the `kill-ring-yank-pointer' to point to the beginning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13612 of the kill ring.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13613
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13614 So what happens with successive calls to `rotate-yank-pointer' is that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13615 it moves the `kill-ring-yank-pointer' from element to element in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13616 kill ring until it reaches the end; then it jumps back to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13617 beginning. And this is why the kill ring is called a ring, since by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13618 jumping back to the beginning, it is as if the list has no end! (And
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13619 what is a ring, but an entity with no end?)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13620
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13621 `yank'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13622 ======
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13623
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13624 After learning about `rotate-yank-pointer', the code for the `yank'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13625 function is almost easy. It has only one tricky part, which is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13626 computation of the argument to be passed to `rotate-yank-pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13627
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13628 The code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13629
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13630 (defun yank (&optional arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13631 "Reinsert the last stretch of killed text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13632 More precisely, reinsert the stretch of killed text most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13633 recently killed OR yanked.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13634 With just C-U as argument, same but put point in front
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13635 (and mark at end). With argument n, reinsert the nth
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13636 most recently killed stretch of killed text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13637 See also the command \\[yank-pop]."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13638
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13639 (interactive "*P")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13640 (rotate-yank-pointer (if (listp arg) 0
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13641 (if (eq arg '-) -1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13642 (1- arg))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13643 (push-mark (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13644 (insert (car kill-ring-yank-pointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13645 (if (consp arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13646 (exchange-point-and-mark)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13647
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13648 Glancing over this code, we can understand the last few lines readily
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13649 enough. The mark is pushed, that is, remembered; then the first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13650 element (the CAR) of what the `kill-ring-yank-pointer' points to is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13651 inserted; and then, if the argument passed the function is a `cons',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13652 point and mark are exchanged so the point is put in the front of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13653 inserted text rather than at the end. This option is explained in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13654 the documentation. The function itself is interactive with `"*P"'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13655 This means it will not work on a read-only buffer, and that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13656 unprocessed prefix argument is passed to the function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13657
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13658 Passing the argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13659 ....................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13660
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13661 The hard part of `yank' is understanding the computation that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13662 determines the value of the argument passed to `rotate-yank-pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13663 Fortunately, it is not so difficult as it looks at first sight.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13664
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13665 What happens is that the result of evaluating one or both of the `if'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13666 expressions will be a number and that number will be the argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13667 passed to `rotate-yank-pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13668
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13669 Laid out with comments, the code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13670
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13671 (if (listp arg) ; if-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13672 0 ; then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13673 (if (eq arg '-) ; else-part, inner if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13674 -1 ; inner if's then-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13675 (1- arg)))) ; inner if's else-part
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13676
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13677 This code consists of two `if' expression, one the else-part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13678 other.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13679
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13680 The first or outer `if' expression tests whether the argument passed
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13681 to `yank' is a list. Oddly enough, this will be true if `yank' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13682 called without an argument--because then it will be passed the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13683 of `nil' for the optional argument and an evaluation of `(listp nil)'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13684 returns true! So, if no argument is passed to `yank', the argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13685 passed to `rotate-yank-pointer' inside of `yank' is zero. This means
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13686 the pointer is not moved and the first element to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13687 `kill-ring-yank-pointer' points is inserted, as we expect.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13688 Similarly, if the argument for `yank' is `C-u', this will be read as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13689 a list, so again, a zero will be passed to `rotate-yank-pointer'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13690 (`C-u' produces an unprocessed prefix argument of `(4)', which is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13691 list of one element.) At the same time, later in the function, this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13692 argument will be read as a `cons' so point will be put in the front
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13693 and mark at the end of the insertion. (The `P' argument to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13694 `interactive' is designed to provide these values for the case when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13695 an optional argument is not provided or when it is `C-u'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13696
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13697 The then-part of the outer `if' expression handles the case when
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13698 there is no argument or when it is `C-u'. The else-part handles the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13699 other situations. The else-part is itself another `if' expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13700
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13701 The inner `if' expression tests whether the argument is a minus sign.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13702 (This is done by pressing the <META> and `-' keys at the same time,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13703 or the <ESC> key and then the `-' key). In this case, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13704 `rotate-yank-pointer' function is passed `-1' as an argument. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13705 moves the `kill-ring-yank-pointer' backwards, which is what is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13706 desired.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13707
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13708 If the true-or-false-test of the inner `if' expression is false (that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13709 is, if the argument is not a minus sign), the else-part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13710 expression is evaluated. This is the expression `(1- arg)'. Because
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13711 of the two `if' expressions, it will only occur when the argument is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13712 a positive number or when it is a negative number (not just a minus
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13713 sign on its own). What `(1- arg)' does is decrement the number and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13714 return it. (The `1-' function subtracts one from its argument.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13715 This means that if the argument to `rotate-yank-pointer' is 1, it is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13716 reduced to zero, which means the first element to which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13717 `kill-ring-yank-pointer' points is yanked back, as you would expect.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13718
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13719 Passing a negative argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13720 ...........................
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13721
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13722 Finally, the question arises, what happens if either the remainder
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13723 function, `%', or the `nthcdr' function is passed a negative
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13724 argument, as they quite well may?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13725
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13726 The answers can be found by a quick test. When `(% -1 5)' is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13727 evaluated, a negative number is returned; and if `nthcdr' is called
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13728 with a negative number, it returns the same value as if it were
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13729 called with a first argument of zero. This can be seen by evaluating
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13730 the following code.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13731
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13732 Here the `=>' points to the result of evaluating the code preceding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13733 it. This was done by positioning the cursor after the code and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13734 typing `C-x C-e' (`eval-last-sexp') in the usual fashion. You can do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13735 this if you are reading this in Info inside of GNU Emacs.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13736
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13737 (% -1 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13738 => -1
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13739
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13740 (setq animals '(cats dogs elephants))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13741 => (cats dogs elephants)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13742
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13743 (nthcdr 1 animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13744 => (dogs elephants)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13745
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13746 (nthcdr 0 animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13747 => (cats dogs elephants)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13748
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13749 (nthcdr -1 animals)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13750 => (cats dogs elephants)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13751
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13752 So, if a minus sign or a negative number is passed to `yank', the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13753 `kill-ring-yank-point' is rotated backwards until it reaches the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13754 beginning of the list. Then it stays there. Unlike the other case,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13755 when it jumps from the end of the list to the beginning of the list,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13756 making a ring, it stops. This makes sense. You often want to get
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13757 back to the most recently clipped out piece of text, but you don't
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13758 usually want to insert text from as many as thirty kill commands ago.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13759 So you need to work through the ring to get to the end, but won't
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13760 cycle around it inadvertently if you are trying to come back to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13761 beginning.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13762
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13763 Incidentally, any number passed to `yank' with a minus sign preceding
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13764 it will be treated as -1. This is evidently a simplification for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13765 writing the program. You don't need to jump back towards the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13766 beginning of the kill ring more than one place at a time and doing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13767 this is easier than writing a function to determine the magnitude of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13768 the number that follows the minus sign.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13769
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13770 `yank-pop'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13771 ==========
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13772
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13773 After understanding `yank', the `yank-pop' function is easy. Leaving
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13774 out the documentation to save space, it looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13775
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13776 (defun yank-pop (arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13777 (interactive "*p")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13778 (if (not (eq last-command 'yank))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13779 (error "Previous command was not a yank"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13780 (setq this-command 'yank)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13781 (let ((before (< (point) (mark))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13782 (delete-region (point) (mark))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13783 (rotate-yank-pointer arg)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13784 (set-mark (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13785 (insert (car kill-ring-yank-pointer))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13786 (if before (exchange-point-and-mark))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13787
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13788 The function is interactive with a small `p' so the prefix argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13789 is processed and passed to the function. The command can only be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13790 used after a previous yank; otherwise an error message is sent. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13791 check uses the variable `last-command' which is discussed elsewhere.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13792 (*Note copy-region-as-kill::.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13793
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13794 The `let' clause sets the variable `before' to true or false
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13795 depending whether point is before or after mark and then the region
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13796 between point and mark is deleted. This is the region that was just
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13797 inserted by the previous yank and it is this text that will be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13798 replaced. Next the `kill-ring-yank-pointer' is rotated so that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13799 previously inserted text is not reinserted yet again. Mark is set at
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13800 the beginning of the place the new text will be inserted and then the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13801 first element to which `kill-ring-yank-pointer' points is inserted.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13802 This leaves point after the new text. If in the previous yank, point
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13803 was left before the inserted text, point and mark are now exchanged
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13804 so point is again left in front of the newly inserted text. That is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13805 all there is to it!
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13806
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13807 A Graph with Labelled Axes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13808 **************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13809
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13810 Printed axes help you understand a graph. They convey scale. In an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13811 earlier chapter (*note Readying a Graph: Readying a Graph.), we wrote
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13812 the code to print the body of a graph. Here we write the code for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13813 printing and labelling vertical and horizontal axes, along with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13814 body itself.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13815
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13816 Labelled Example Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13817 ======================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13818
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13819 Since insertions fill a buffer to the right and below point, the new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13820 graph printing function should first print the Y or vertical axis,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13821 then the body of the graph, and finally the X or horizontal axis.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13822 This sequence lays out for us the contents of the function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13823
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13824 1. Set up code.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13825
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13826 2. Print Y axis.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13827
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13828 3. Print body of graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13829
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13830 4. Print X axis.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13831
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13832 Here is an example of how a finished graph should look:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13833
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13834 10 -
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13835 *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13836 * *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13837 * **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13838 * ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13839 5 - * *******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13840 * *** *******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13841 *************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13842 ***************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13843 1 - ****************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13844 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13845 1 5 10 15
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13846
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13847 In this graph, both the vertical and the horizontal axes are labelled
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13848 with numbers. However, in some graphs, the horizontal axis is time
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13849 and would be better labelled with months, like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13850
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13851 5 - *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13852 * ** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13853 *******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13854 ********** **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13855 1 - **************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13856 | ^ |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13857 Jan June Jan
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13858
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13859 Indeed, with a little thought, we can easily come up with a variety of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13860 vertical and horizontal labelling schemes. Our task could become
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13861 complicated. But complications breed confusion. Rather than permit
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13862 this, it is better choose a simple labelling scheme for our first
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13863 effort, and to modify or replace it later.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13864
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13865 These considerations suggest the following outline for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13866 `print-graph' function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13867
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13868 (defun print-graph (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13869 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13870 (let ((height ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13871 ...))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13872 (print-Y-axis height ... )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13873 (graph-body-print numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13874 (print-X-axis ... )))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13875
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13876 We can work on each part of the `print-graph' function definition in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13877 turn.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13878
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13879 The `print-graph' Varlist
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13880 =========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13881
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13882 In writing the `print-graph' function, the first task is to write the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13883 varlist in the `let' expression. (We will leave aside for the moment
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13884 any thoughts about making the function interactive or about the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13885 contents of its documentation string.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13886
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13887 The varlist should set several values. Clearly, the top of the label
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13888 for the vertical axis must be at least the height of the graph, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13889 means that we must obtain this information here. Note that the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13890 `print-graph-body' function also requires this information. There is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13891 no reason to calculate the height of the graph in two different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13892 places, so we should change `print-graph-body' from the way we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13893 defined it earlier to take advantage of the calculation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13894
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13895 Similarly, both the function for printing the X axis labels and the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13896 `print-graph-body' function need to learn the value of the width of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13897 each symbol. We can perform the calculation here and change the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13898 definition for `print-graph-body' from the way we defined it in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13899 previous chapter.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13900
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13901 The length of the label for the horizontal axis must be at least as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13902 long as the graph. However, this information is used only in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13903 function that prints the horizontal axis, so it does not need to be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13904 calculated here.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13905
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13906 These thoughts lead us directly to the following form for the varlist
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13907 in the `let' for `print-graph':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13908
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13909 (let ((height (apply 'max numbers-list)) ; First version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13910 (symbol-width (length graph-blank)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13911
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13912 As we shall see, this expression is not quite right.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13913
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13914 The `print-Y-axis' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13915 ===========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13916
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13917 The job of the `print-Y-axis' function is to print a label for the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13918 vertical axis that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13919
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13920 10 -
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13921
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13922
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13923
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13924
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13925 5 -
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13926
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13927
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13928
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13929 1 -
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13930
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13931 The function should be passed the height of the graph, and then should
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13932 construct and insert the appropriate numbers and marks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13933
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13934 It is easy enough to see in the figure what the Y axis label should
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13935 look like; but to say in words, and then to write a function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13936 definition to do the job is another matter. It is not quite true to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13937 say that we want a number and a tic every five lines: there are only
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13938 three lines between the `1' and the `5' (lines 2, 3, and 4), but four
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13939 lines between the `5' and the `10' (lines 6, 7, 8, and 9). It is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13940 better to say that we want a number and a tic mark on the base line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13941 (number 1) and then that we want a number and a tic on the fifth line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13942 from the bottom and on every line that is a multiple of five.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13943
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13944 What height should the label be?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13945 --------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13946
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13947 The next issue is what height the label should be? Suppose the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13948 maximum height of tallest column of the graph is seven. Should the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13949 highest label on the Y axis be `5 -', and should the graph stick up
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13950 above the label? Or should the highest label be `7 -', and mark the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13951 peak of the graph? Or should the highest label be `10 -', which is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13952 multiple of five, and be higher than the topmost value of the graph?
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13953
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13954 The latter form is preferred. Most graphs are drawn within rectangles
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13955 whose sides are an integral number of steps long--5, 10, 15, and so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13956 on for a step distance of five. But as soon as we decide to use a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13957 step height for the vertical axis, we discover that the simple
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13958 expression in the varlist for computing the height is wrong. The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13959 expression is `(apply 'max numbers-list)'. This returns the precise
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13960 height, not the maximum height plus whatever is necessary to round up
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13961 to the nearest multiple of five. A more complex expression is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13962 required.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13963
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13964 As usual in cases like this, a complex problem becomes simpler if it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13965 is divided into several smaller problems.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13966
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13967 First, consider the case when the highest value of the graph is an
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13968 integral multiple of five--when it is 5, 10, 15 ,or some higher
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13969 multiple of five. We can use this value as the Y axis height.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13970
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13971 A fairly simply way to determine whether a number is a multiple of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13972 five is to divide it by five and see if the division results in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13973 remainder. If there is no remainder, the number is a multiple of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13974 five. Thus, seven divided by five has a remainder of two, and seven
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13975 is not an integral multiple of five. Put in slightly different
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13976 language, more reminiscent of the classroom, five goes into seven
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13977 once, with a remainder of two. However, five goes into ten twice,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13978 with no remainder: ten is an integral multiple of five.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13979
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13980 Side Trip: Compute a Remainder
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13981 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13982
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13983 In Lisp, the function for computing a remainder is `%'. The function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13984 returns the remainder of its first argument divided by its second
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13985 argument. As it happens, `%' is a function in Emacs Lisp that you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13986 cannot discover using `apropos': you find nothing if you type `M-x
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13987 apropos <RET> remainder <RET>'. The only way to learn of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13988 existence of `%' is to read about it in a book such as this or in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13989 Emacs Lisp sources. The `%' function is used in the code for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13990 `rotate-yank-pointer', which is described in an appendix. (*Note The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13991 Body of `rotate-yank-pointer': rotate-yk-ptr body.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13992
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13993 You can try the `%' function by evaluating the following two
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13994 expressions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13995
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13996 (% 7 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13997
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13998 (% 10 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
13999
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14000 The first expression returns 2 and the second expression returns 0.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14001
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14002 To test whether the returned value is zero or some other number, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14003 can use the `zerop' function. This function returns `t' if its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14004 argument, which must be a number, is zero.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14005
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14006 (zerop (% 7 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14007 => nil
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14008
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14009 (zerop (% 10 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14010 => t
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14011
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14012 Thus, the following expression will return `t' if the height of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14013 graph is evenly divisible by five:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14014
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14015 (zerop (% height 5))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14016
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14017 (The value of `height', of course, can be found from `(apply 'max
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14018 numbers-list)'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14019
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14020 On the other hand, if the value of `height' is not a multiple of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14021 five, we want to reset the value to the next higher multiple of five.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14022 This is straightforward arithmetic using functions with which we are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14023 already familiar. First, we divide the value of `height' by five to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14024 determine how many times five goes into the number. Thus, five goes
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14025 into twelve twice. If we add one to this quotient and multiply by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14026 five, we will obtain the value of the next multiple of five that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14027 larger than the height. Five goes into twelve twice. Add one to two,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14028 and multiply by five; the result is fifteen, which is the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14029 multiple of five that is higher than twelve. The Lisp expression for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14030 this is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14031
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14032 (* (1+ (/ height 5)) 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14033
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14034 For example, if you evaluate the following, the result is 15:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14035
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14036 (* (1+ (/ 12 5)) 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14037
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14038 All through this discussion, we have been using `five' as the value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14039 for spacing labels on the Y axis; but we may want to use some other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14040 value. For generality, we should replace `five' with a variable to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14041 which we can assign a value. The best name I can think of for this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14042 variable is `Y-axis-label-spacing'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14043
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14044 Using this term, and an `if' expression, we produce the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14045
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14046 (if (zerop (% height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14047 height
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14048 ;; else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14049 (* (1+ (/ height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14050 Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14051
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14052 This expression returns the value of `height' itself if the height is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14053 an even multiple of the value of the `Y-axis-label-spacing' or else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14054 it computes and returns a value of `height' that is equal to the next
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14055 higher multiple of the value of the `Y-axis-label-spacing'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14056
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14057 We can now include this expression in the `let' expression of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14058 `print-graph' function (after first setting the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14059 `Y-axis-label-spacing'):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14060
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14061 (defvar Y-axis-label-spacing 5
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14062 "Number of lines from one Y axis label to next.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14063
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14064 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14065 (let* ((height (apply 'max numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14066 (height-of-top-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14067 (if (zerop (% height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14068 height
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14069 ;; else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14070 (* (1+ (/ height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14071 Y-axis-label-spacing)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14072 (symbol-width (length graph-blank))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14073 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14074
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14075 (Note use of the `let*' function: the initial value of height is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14076 computed once by the `(apply 'max numbers-list)' expression and then
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14077 the resulting value of `height' is used to compute its final value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14078 *Note The `let*' expression: fwd-para let, for more about `let*'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14079
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14080 Construct a Y Axis Element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14081 --------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14082
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14083 When we print the vertical axis, we want to insert strings such as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14084 `5 -' and `10 - ' every five lines. Moreover, we want the numbers
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14085 and dashes to line up, so shorter numbers must be padded with leading
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14086 spaces. If some of the strings use two digit numbers, the strings
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14087 with single digit numbers must include a leading blank space before
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14088 the number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14089
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14090 To figure out the length of the number, the `length' function is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14091 used. But the `length' function works only with a string, not with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14092 number. So the number has to be converted from being a number to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14093 being a string. This is done with the `number-to-string' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14094 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14095
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14096 (length (number-to-string 35))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14097 => 2
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14098
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14099 (length (number-to-string 100))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14100 => 3
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14101
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14102 (`number-to-string' is also called `int-to-string'; you will see this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14103 alternative name in various sources.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14104
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14105 In addition, in each label, each number is followed by a string such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14106 as ` - ', which we will call the `Y-axis-tic' marker. This variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14107 is defined with `defvar':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14108
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14109 (defvar Y-axis-tic " - "
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14110 "String that follows number in a Y axis label.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14111
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14112 The length of the Y label is the sum of the length of the Y axis tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14113 mark and the length of the number of the top of the graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14114
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14115 (length (concat (number-to-string height) Y-axis-tic)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14116
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14117 This value will be calculated by the `print-graph' function in its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14118 varlist as `full-Y-label-width' and passed on. (Note that we did not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14119 think to include this in the varlist when we first proposed it.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14120
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14121 To make a complete vertical axis label, a tic mark is concatenated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14122 with a number; and the two together may be preceded by one or more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14123 spaces depending on how long the number is. The label consists of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14124 three parts: the (optional) leading spaces, the number, and the tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14125 mark. The function is passed the value of the number for the specific
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14126 row, and the value of the width of the top line, which is calculated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14127 (just once) by `print-graph'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14128
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14129 (defun Y-axis-element (number full-Y-label-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14130 "Construct a NUMBERed label element.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14131 A numbered element looks like this ` 5 - ',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14132 and is padded as needed so all line up with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14133 the element for the largest number."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14134 (let* ((leading-spaces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14135 (- full-Y-label-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14136 (length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14137 (concat (number-to-string number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14138 Y-axis-tic)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14139 (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14140 (make-string leading-spaces ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14141 (number-to-string number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14142 Y-axis-tic)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14143
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14144 The `Y-axis-element' function concatenates together the leading
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14145 spaces, if any; the number, as a string; and the tic mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14146
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14147 To figure out how many leading spaces the label will need, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14148 function subtracts the actual length of the label--the length of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14149 number plus the length of the tic mark--from the desired label width.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14150
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14151 Blank spaces are inserted using the `make-string' function. This
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14152 function takes two arguments: the first tells it how long the string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14153 will be and the second is a symbol for the character to insert, in a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14154 special format. The format is a question mark followed by a blank
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14155 space, like this, `? '. *Note Character Type: (elisp)Character Type,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14156 for a description of the syntax for characters.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14157
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14158 The `number-to-string' function is used in the concatenation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14159 expression, to convert the number to a string that is concatenated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14160 with the leading spaces and the tic mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14161
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14162 Create a Y Axis Column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14163 ----------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14164
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14165 The preceding functions provide all the tools needed to construct a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14166 function that generates a list of numbered and blank strings to insert
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14167 as the label for the vertical axis:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14168
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14169 (defun Y-axis-column (height width-of-label)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14170 "Construct list of Y axis labels and blank strings.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14171 For HEIGHT of line above base and WIDTH-OF-LABEL."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14172 (let (Y-axis)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14173 (while (> height 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14174 (if (zerop (% height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14175 ;; Insert label.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14176 (setq Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14177 (cons
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14178 (Y-axis-element height width-of-label)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14179 Y-axis))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14180 ;; Else, insert blanks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14181 (setq Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14182 (cons
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14183 (make-string width-of-label ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14184 Y-axis)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14185 (setq height (1- height)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14186 ;; Insert base line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14187 (setq Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14188 (cons (Y-axis-element 1 width-of-label) Y-axis))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14189 (nreverse Y-axis)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14190
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14191 In this function, we start with the value of `height' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14192 repetitively subtract one from its value. After each subtraction, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14193 test to see whether the value is an integral multiple of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14194 `Y-axis-label-spacing'. If it is, we construct a numbered label
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14195 using the `Y-axis-element' function; if not, we construct a blank
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14196 label using the `make-string' function. The base line consists of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14197 the number one followed by a tic mark.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14198
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14199 The Not Quite Final Version of `print-Y-axis'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14200 ---------------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14201
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14202 The list constructed by the `Y-axis-column' function is passed to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14203 `print-Y-axis' function, which inserts the list as a column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14204
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14205 (defun print-Y-axis (height full-Y-label-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14206 "Insert Y axis using HEIGHT and FULL-Y-LABEL-WIDTH.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14207 Height must be the maximum height of the graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14208 Full width is the width of the highest label element."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14209 ;; Value of height and full-Y-label-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14210 ;; are passed by `print-graph'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14211 (let ((start (point)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14212 (insert-rectangle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14213 (Y-axis-column height full-Y-label-width))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14214 ;; Place point ready for inserting graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14215 (goto-char start)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14216 ;; Move point forward by value of full-Y-label-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14217 (forward-char full-Y-label-width)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14218
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14219 The `print-Y-axis' uses the `insert-rectangle' function to insert the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14220 Y axis labels created by the `Y-axis-column' function. In addition,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14221 it places point at the correct position for printing the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14222 graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14223
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14224 You can test `print-Y-axis':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14226 1. Install
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14227
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14228 Y-axis-label-spacing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14229 Y-axis-tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14230 Y-axis-element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14231 Y-axis-column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14232 print-Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14233
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14234 2. Copy the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14235
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14236 (print-Y-axis 12 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14237
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14238 3. Switch to the `*scratch*' buffer and place the cursor where you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14239 want the axis labels to start.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14240
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14241 4. Type `M-:' (`eval-expression').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14242
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14243 5. Yank the `graph-body-print' expression into the minibuffer with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14244 `C-y' (`yank)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14245
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14246 6. Press <RET> to evaluate the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14247
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14248 Emacs will print labels vertically, the top one being `10 - '. (The
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14249 `print-graph' function will pass the value of `height-of-top-line',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14250 which in this case would end up as 15.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14251
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14252 The `print-X-axis' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14253 ===========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14254
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14255 X axis labels are much like Y axis labels, except that the tics are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14256 on a line above the numbers. Labels should look like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14257
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14258 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14259 1 5 10 15
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14260
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14261 The first tic is under the first column of the graph and is preceded
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14262 by several blank spaces. These spaces provide room in rows above for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14263 the Y axis labels. The second, third, fourth, and subsequent tics
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14264 are all spaced equally, according to the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14265 `X-axis-label-spacing'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14266
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14267 The second row of the X axis consists of numbers, preceded by several
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14268 blank spaces and also separated according to the value of the variable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14269 `X-axis-label-spacing'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14270
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14271 The value of the variable `X-axis-label-spacing' should itself be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14272 measured in units of `symbol-width', since you may want to change the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14273 width of the symbols that you are using to print the body of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14274 graph without changing the ways the graph is labelled.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14275
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14276 Similarities and differences
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14277 ----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14278
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14279 The `print-X-axis' function is constructed in more or less the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14280 fashion as the `print-Y-axis' function except that it has two lines:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14281 the line of tic marks and the numbers. We will write a separate
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14282 function to print each line and then combine them within the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14283 `print-X-axis' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14284
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14285 This is a three step process:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14286
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14287 1. Write a function to print the X axis tic marks,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14288 `print-X-axis-tic-line'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14289
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14290 2. Write a function to print the X numbers,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14291 `print-X-axis-numbered-line'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14292
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14293 3. Write a function to print both lines, the `print-X-axis'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14294 function, using `print-X-axis-tic-line' and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14295 `print-X-axis-numbered-line'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14296
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14297 X Axis Tic Marks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14298 ----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14299
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14300 The first function should print the X axis tic marks. We must specify
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14301 the tic marks themselves and their spacing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14302
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14303 (defvar X-axis-label-spacing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14304 (if (boundp 'graph-blank)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14305 (* 5 (length graph-blank)) 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14306 "Number of units from one X axis label to next.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14307
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14308 (Note that the value of `graph-blank' is set by another `defvar'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14309 The `boundp' predicate checks whether it has already been set;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14310 `boundp' returns `nil' if it has not. If `graph-blank' were unbound
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14311 and we did not use this conditional construction, in GNU Emacs 21, we
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14312 would enter the debugger and see an error message saying
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14313 `Debugger entered--Lisp error: (void-variable graph-blank)'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14314
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14315 Here is the `defvar' for `X-axis-tic-symbol':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14316
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14317 (defvar X-axis-tic-symbol "|"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14318 "String to insert to point to a column in X axis.")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14319
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14320 The goal is to make a line that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14321
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14322 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14323
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14324 The first tic is indented so that it is under the first column, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14325 is indented to provide space for the Y axis labels.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14326
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14327 A tic element consists of the blank spaces that stretch from one tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14328 to the next plus a tic symbol. The number of blanks is determined by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14329 the width of the tic symbol and the `X-axis-label-spacing'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14331 The code looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14332
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14333 ;;; X-axis-tic-element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14334 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14335 (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14336 (make-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14337 ;; Make a string of blanks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14338 (- (* symbol-width X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14339 (length X-axis-tic-symbol))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14340 ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14341 ;; Concatenate blanks with tic symbol.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14342 X-axis-tic-symbol)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14343 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14344
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14345 Next, we determine how many blanks are needed to indent the first tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14346 mark to the first column of the graph. This uses the value of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14347 `full-Y-label-width' passed it by the `print-graph' function.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14348
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14349 The code to make `X-axis-leading-spaces' looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14350
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14351 ;; X-axis-leading-spaces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14352 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14353 (make-string full-Y-label-width ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14354 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14355
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14356 We also need to determine the length of the horizontal axis, which is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14357 the length of the numbers list, and the number of tics in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14358 horizontal axis:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14359
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14360 ;; X-length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14361 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14362 (length numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14363
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14364 ;; tic-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14365 ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14366 (* symbol-width X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14367
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14368 ;; number-of-X-tics
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14369 (if (zerop (% (X-length tic-width)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14370 (/ (X-length tic-width))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14371 (1+ (/ (X-length tic-width))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14372
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14373 All this leads us directly to the function for printing the X axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14374 tic line:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14375
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14376 (defun print-X-axis-tic-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14377 (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14378 "Print tics for X axis."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14379 (insert X-axis-leading-spaces)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14380 (insert X-axis-tic-symbol) ; Under first column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14381 ;; Insert second tic in the right spot.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14382 (insert (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14383 (make-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14384 (- (* symbol-width X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14385 ;; Insert white space up to second tic symbol.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14386 (* 2 (length X-axis-tic-symbol)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14387 ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14388 X-axis-tic-symbol))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14389 ;; Insert remaining tics.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14390 (while (> number-of-X-tics 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14391 (insert X-axis-tic-element)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14392 (setq number-of-X-tics (1- number-of-X-tics))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14393
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14394 The line of numbers is equally straightforward:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14395
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14396 First, we create a numbered element with blank spaces before each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14397 number:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14398
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14399 (defun X-axis-element (number)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14400 "Construct a numbered X axis element."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14401 (let ((leading-spaces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14402 (- (* symbol-width X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14403 (length (number-to-string number)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14404 (concat (make-string leading-spaces ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14405 (number-to-string number))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14406
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14407 Next, we create the function to print the numbered line, starting with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14408 the number "1" under the first column:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14409
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14410 (defun print-X-axis-numbered-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14411 (number-of-X-tics X-axis-leading-spaces)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14412 "Print line of X-axis numbers"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14413 (let ((number X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14414 (insert X-axis-leading-spaces)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14415 (insert "1")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14416 (insert (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14417 (make-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14418 ;; Insert white space up to next number.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14419 (- (* symbol-width X-axis-label-spacing) 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14420 ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14421 (number-to-string number)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14422 ;; Insert remaining numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14423 (setq number (+ number X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14424 (while (> number-of-X-tics 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14425 (insert (X-axis-element number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14426 (setq number (+ number X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14427 (setq number-of-X-tics (1- number-of-X-tics)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14428
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14429 Finally, we need to write the `print-X-axis' that uses
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14430 `print-X-axis-tic-line' and `print-X-axis-numbered-line'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14431
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14432 The function must determine the local values of the variables used by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14433 both `print-X-axis-tic-line' and `print-X-axis-numbered-line', and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14434 then it must call them. Also, it must print the carriage return that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14435 separates the two lines.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14436
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14437 The function consists of a varlist that specifies five local
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14438 variables, and calls to each of the two line printing functions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14439
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14440 (defun print-X-axis (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14441 "Print X axis labels to length of NUMBERS-LIST."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14442 (let* ((leading-spaces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14443 (make-string full-Y-label-width ? ))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14444 ;; symbol-width is provided by graph-body-print
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14445 (tic-width (* symbol-width X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14446 (X-length (length numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14447 (X-tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14448 (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14449 (make-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14450 ;; Make a string of blanks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14451 (- (* symbol-width X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14452 (length X-axis-tic-symbol))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14453 ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14454 ;; Concatenate blanks with tic symbol.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14455 X-axis-tic-symbol))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14456 (tic-number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14457 (if (zerop (% X-length tic-width))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14458 (/ X-length tic-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14459 (1+ (/ X-length tic-width)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14460 (print-X-axis-tic-line tic-number leading-spaces X-tic)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14461 (insert "\n")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14462 (print-X-axis-numbered-line tic-number leading-spaces)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14463
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14464 You can test `print-X-axis':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14465
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14466 1. Install `X-axis-tic-symbol', `X-axis-label-spacing',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14467 `print-X-axis-tic-line', as well as `X-axis-element',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14468 `print-X-axis-numbered-line', and `print-X-axis'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14469
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14470 2. Copy the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14471
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14472 (progn
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14473 (let ((full-Y-label-width 5)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14474 (symbol-width 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14475 (print-X-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14476 '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14477
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14478 3. Switch to the `*scratch*' buffer and place the cursor where you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14479 want the axis labels to start.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14480
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14481 4. Type `M-:' (`eval-expression').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14482
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14483 5. Yank the test expression into the minibuffer with `C-y' (`yank)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14484
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14485 6. Press <RET> to evaluate the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14486
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14487 Emacs will print the horizontal axis like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14488
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14489 | | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14490 1 5 10 15 20
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14491
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14492 Printing the Whole Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14493 ========================
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14494
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14495 Now we are nearly ready to print the whole graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14496
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14497 The function to print the graph with the proper labels follows the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14498 outline we created earlier (*note A Graph with Labelled Axes: Full
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14499 Graph.), but with additions.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14500
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14501 Here is the outline:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14502
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14503 (defun print-graph (numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14504 "DOCUMENTATION..."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14505 (let ((height ...
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14506 ...))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14507 (print-Y-axis height ... )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14508 (graph-body-print numbers-list)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14509 (print-X-axis ... )))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14510
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14511 Changes for the Final Version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14512 -----------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14513
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14514 The final version is different from what we planned in two ways:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14515 first, it contains additional values calculated once in the varlist;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14516 second, it carries an option to specify the labels' increment per row.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14517 This latter feature turns out to be essential; otherwise, a graph may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14518 have more rows than fit on a display or on a sheet of paper.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14519
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14520 This new feature requires a change to the `Y-axis-column' function,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14521 to add `vertical-step' to it. The function looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14522
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14523 ;;; Final version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14524 (defun Y-axis-column
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14525 (height width-of-label &optional vertical-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14526 "Construct list of labels for Y axis.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14527 HEIGHT is maximum height of graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14528 WIDTH-OF-LABEL is maximum width of label.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14529 VERTICAL-STEP, an option, is a positive integer
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14530 that specifies how much a Y axis label increments
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14531 for each line. For example, a step of 5 means
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14532 that each line is five units of the graph."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14533 (let (Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14534 (number-per-line (or vertical-step 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14535 (while (> height 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14536 (if (zerop (% height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14537 ;; Insert label.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14538 (setq Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14539 (cons
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14540 (Y-axis-element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14541 (* height number-per-line)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14542 width-of-label)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14543 Y-axis))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14544 ;; Else, insert blanks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14545 (setq Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14546 (cons
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14547 (make-string width-of-label ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14548 Y-axis)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14549 (setq height (1- height)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14550 ;; Insert base line.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14551 (setq Y-axis (cons (Y-axis-element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14552 (or vertical-step 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14553 width-of-label)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14554 Y-axis))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14555 (nreverse Y-axis)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14556
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14557 The values for the maximum height of graph and the width of a symbol
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14558 are computed by `print-graph' in its `let' expression; so
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14559 `graph-body-print' must be changed to accept them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14560
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14561 ;;; Final version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14562 (defun graph-body-print (numbers-list height symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14563 "Print a bar graph of the NUMBERS-LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14564 The numbers-list consists of the Y-axis values.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14565 HEIGHT is maximum height of graph.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14566 SYMBOL-WIDTH is number of each column."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14567 (let (from-position)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14568 (while numbers-list
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14569 (setq from-position (point))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14570 (insert-rectangle
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14571 (column-of-graph height (car numbers-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14572 (goto-char from-position)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14573 (forward-char symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14574 ;; Draw graph column by column.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14575 (sit-for 0)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14576 (setq numbers-list (cdr numbers-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14577 ;; Place point for X axis labels.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14578 (forward-line height)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14579 (insert "\n")))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14580
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14581 Finally, the code for the `print-graph' function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14582
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14583 ;;; Final version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14584 (defun print-graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14585 (numbers-list &optional vertical-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14586 "Print labelled bar graph of the NUMBERS-LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14587 The numbers-list consists of the Y-axis values.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14588
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14589 Optionally, VERTICAL-STEP, a positive integer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14590 specifies how much a Y axis label increments for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14591 each line. For example, a step of 5 means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14592 each row is five units."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14593 (let* ((symbol-width (length graph-blank))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14594 ;; `height' is both the largest number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14595 ;; and the number with the most digits.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14596 (height (apply 'max numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14597 (height-of-top-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14598 (if (zerop (% height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14599 height
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14600 ;; else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14601 (* (1+ (/ height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14602 Y-axis-label-spacing)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14603 (vertical-step (or vertical-step 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14604 (full-Y-label-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14605 (length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14606 (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14607 (number-to-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14608 (* height-of-top-line vertical-step))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14609 Y-axis-tic))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14610
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14611 (print-Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14612 height-of-top-line full-Y-label-width vertical-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14613 (graph-body-print
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14614 numbers-list height-of-top-line symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14615 (print-X-axis numbers-list)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14616
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14617 Testing `print-graph'
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14618 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14619
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14620 We can test the `print-graph' function with a short list of numbers:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14621
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14622 1. Install the final versions of `Y-axis-column',
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14623 `graph-body-print', and `print-graph' (in addition to the rest
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14624 of the code.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14625
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14626 2. Copy the following expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14627
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14628 (print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14629
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14630 3. Switch to the `*scratch*' buffer and place the cursor where you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14631 want the axis labels to start.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14632
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14633 4. Type `M-:' (`eval-expression').
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14634
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14635 5. Yank the test expression into the minibuffer with `C-y' (`yank)'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14636
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14637 6. Press <RET> to evaluate the expression.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14638
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14639 Emacs will print a graph that looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14640
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14641 10 -
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14642
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14643
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14644 *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14645 ** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14646 5 - **** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14647 **** ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14648 * *********
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14649 ************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14650 1 - *************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14651
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14652 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14653 1 5 10 15
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14654
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14655 On the other hand, if you pass `print-graph' a `vertical-step' value
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14656 of 2, by evaluating this expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14657
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14658 (print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1) 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14659
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14660 The graph looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14661
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14662 20 -
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14663
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14664
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14665 *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14666 ** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14667 10 - **** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14668 **** ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14669 * *********
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14670 ************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14671 2 - *************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14672
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14673 | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14674 1 5 10 15
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14675
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14676 (A question: is the `2' on the bottom of the vertical axis a bug or a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14677 feature? If you think it is a bug, and should be a `1' instead, (or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14678 even a `0'), you can modify the sources.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14679
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14680 Graphing Numbers of Words and Symbols
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14681 -------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14682
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14683 Now for the graph for which all this code was written: a graph that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14684 shows how many function definitions contain fewer than 10 words and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14685 symbols, how many contain between 10 and 19 words and symbols, how
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14686 many contain between 20 and 29 words and symbols, and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14687
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14688 This is a multi-step process. First make sure you have loaded all the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14689 requisite code.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14690
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14691 It is a good idea to reset the value of `top-of-ranges' in case you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14692 have set it to some different value. You can evaluate the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14693
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14694 (setq top-of-ranges
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14695 '(10 20 30 40 50
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14696 60 70 80 90 100
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14697 110 120 130 140 150
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14698 160 170 180 190 200
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14699 210 220 230 240 250
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14700 260 270 280 290 300)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14701
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14702 Next create a list of the number of words and symbols in each range.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14703
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14704 Evaluate the following:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14705
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14706 (setq list-for-graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14707 (defuns-per-range
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14708 (sort
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14709 (recursive-lengths-list-many-files
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14710 (directory-files "/usr/local/emacs/lisp"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14711 t ".+el$"))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14712 '<)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14713 top-of-ranges))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14714
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14715 On my machine, this takes about an hour. It looks though 303 Lisp
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14716 files in my copy of Emacs version 19.23. After all that computing,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14717 the `list-for-graph' has this value:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14718
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14719 (537 1027 955 785 594 483 349 292 224 199 166 120 116 99
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14720 90 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14721
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14722 This means that my copy of Emacs has 537 function definitions with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14723 fewer than 10 words or symbols in them, 1,027 function definitions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14724 with 10 to 19 words or symbols in them, 955 function definitions with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14725 20 to 29 words or symbols in them, and so on.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14726
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14727 Clearly, just by looking at this list we can see that most function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14728 definitions contain ten to thirty words and symbols.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14729
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14730 Now for printing. We do _not_ want to print a graph that is 1,030
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14731 lines high ... Instead, we should print a graph that is fewer than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14732 twenty-five lines high. A graph that height can be displayed on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14733 almost any monitor, and easily printed on a sheet of paper.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14734
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14735 This means that each value in `list-for-graph' must be reduced to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14736 one-fiftieth its present value.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14737
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14738 Here is a short function to do just that, using two functions we have
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14739 not yet seen, `mapcar' and `lambda'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14740
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14741 (defun one-fiftieth (full-range)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14742 "Return list, each number one-fiftieth of previous."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14743 (mapcar '(lambda (arg) (/ arg 50)) full-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14744
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14745 A `lambda' Expression: Useful Anonymity
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14746 ---------------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14747
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14748 `lambda' is the symbol for an anonymous function, a function without
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14749 a name. Every time you use an anonymous function, you need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14750 include its whole body.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14751
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14752 Thus,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14753
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14754 (lambda (arg) (/ arg 50))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14755
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14756 is a function definition that says `return the value resulting from
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14757 dividing whatever is passed to me as `arg' by 50'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14758
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14759 Earlier, for example, we had a function `multiply-by-seven'; it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14760 multiplied its argument by 7. This function is similar, except it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14761 divides its argument by 50; and, it has no name. The anonymous
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14762 equivalent of `multiply-by-seven' is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14763
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14764 (lambda (number) (* 7 number))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14765
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14766 (*Note The `defun' Special Form: defun.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14767
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14768 If we want to multiply 3 by 7, we can write:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14769
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14770 (multiply-by-seven 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14771 \_______________/ ^
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14772 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14773 function argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14774
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14775
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14776
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14777 This expression returns 21.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14778
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14779 Similarly, we can write:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14780
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14781 ((lambda (number) (* 7 number)) 3)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14782 \____________________________/ ^
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14783 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14784 anonymous function argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14785
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14786
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14787
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14788 If we want to divide 100 by 50, we can write:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14789
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14790 ((lambda (arg) (/ arg 50)) 100)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14791 \______________________/ \_/
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14792 | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14793 anonymous function argument
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14794
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14795
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14796
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14797 This expression returns 2. The 100 is passed to the function, which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14798 divides that number by 50.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14799
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14800 *Note Lambda Expressions: (elisp)Lambda Expressions, for more about
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14801 `lambda'. Lisp and lambda expressions derive from the Lambda
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14802 Calculus.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14803
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14804 The `mapcar' Function
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14805 ---------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14806
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14807 `mapcar' is a function that calls its first argument with each
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14808 element of its second argument, in turn. The second argument must be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14809 a sequence.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14810
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14811 The `map' part of the name comes from the mathematical phrase,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14812 `mapping over a domain', meaning to apply a function to each of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14813 elements in a domain. The mathematical phrase is based on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14814 metaphor of a surveyor walking, one step at a time, over an area he is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14815 mapping. And `car', of course, comes from the Lisp notion of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14816 first of a list.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14817
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14818 For example,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14819
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14820 (mapcar '1+ '(2 4 6))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14821 => (3 5 7)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14822
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14823 The function `1+' which adds one to its argument, is executed on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14824 _each_ element of the list, and a new list is returned.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14825
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14826 Contrast this with `apply', which applies its first argument to all
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14827 the remaining. (*Note Readying a Graph: Readying a Graph, for a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14828 explanation of `apply'.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14829
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14830 In the definition of `one-fiftieth', the first argument is the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14831 anonymous function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14832
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14833 (lambda (arg) (/ arg 50))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14834
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14835 and the second argument is `full-range', which will be bound to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14836 `list-for-graph'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14837
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14838 The whole expression looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14839
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14840 (mapcar '(lambda (arg) (/ arg 50)) full-range))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14841
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14842 *Note Mapping Functions: (elisp)Mapping Functions, for more about
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14843 `mapcar'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14844
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14845 Using the `one-fiftieth' function, we can generate a list in which
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14846 each element is one-fiftieth the size of the corresponding element in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14847 `list-for-graph'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14848
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14849 (setq fiftieth-list-for-graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14850 (one-fiftieth list-for-graph))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14851
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14852 The resulting list looks like this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14853
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14854 (10 20 19 15 11 9 6 5 4 3 3 2 2
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14855 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14856
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14857 This, we are almost ready to print! (We also notice the loss of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14858 information: many of the higher ranges are 0, meaning that fewer than
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14859 50 defuns had that many words or symbols--but not necessarily meaning
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14860 that none had that many words or symbols.)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14861
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14862 Another Bug ... Most Insidious
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14863 ------------------------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14864
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14865 I said `almost ready to print'! Of course, there is a bug in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14866 `print-graph' function ... It has a `vertical-step' option, but not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14867 a `horizontal-step' option. The `top-of-range' scale goes from 10 to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14868 300 by tens. But the `print-graph' function will print only by ones.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14869
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14870 This is a classic example of what some consider the most insidious
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14871 type of bug, the bug of omission. This is not the kind of bug you can
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14872 find by studying the code, for it is not in the code; it is an omitted
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14873 feature. Your best actions are to try your program early and often;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14874 and try to arrange, as much as you can, to write code that is easy to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14875 understand and easy to change. Try to be aware, whenever you can,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14876 that whatever you have written, _will_ be rewritten, if not soon,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14877 eventually. A hard maxim to follow.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14878
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14879 It is the `print-X-axis-numbered-line' function that needs the work;
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14880 and then the `print-X-axis' and the `print-graph' functions need to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14881 be adapted. Not much needs to be done; there is one nicety: the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14882 numbers ought to line up under the tic marks. This takes a little
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14883 thought.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14884
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14885 Here is the corrected `print-X-axis-numbered-line':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14886
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14887 (defun print-X-axis-numbered-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14888 (number-of-X-tics X-axis-leading-spaces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14889 &optional horizontal-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14890 "Print line of X-axis numbers"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14891 (let ((number X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14892 (horizontal-step (or horizontal-step 1)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14893 (insert X-axis-leading-spaces)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14894 ;; Delete extra leading spaces.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14895 (delete-char
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14896 (- (1-
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14897 (length (number-to-string horizontal-step)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14898 (insert (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14899 (make-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14900 ;; Insert white space.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14901 (- (* symbol-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14902 X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14903 (1-
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14904 (length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14905 (number-to-string horizontal-step)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14906 2)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14907 ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14908 (number-to-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14909 (* number horizontal-step))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14910 ;; Insert remaining numbers.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14911 (setq number (+ number X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14912 (while (> number-of-X-tics 1)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14913 (insert (X-axis-element
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14914 (* number horizontal-step)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14915 (setq number (+ number X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14916 (setq number-of-X-tics (1- number-of-X-tics)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14917
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14918 If you are reading this in Info, you can see the new versions of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14919 `print-X-axis' `print-graph' and evaluate them. If you are reading
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14920 this in a printed book, you can see the changed lines here (the full
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14921 text is too much to print).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14922
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14923 (defun print-X-axis (numbers-list horizontal-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14924 "Print X axis labels to length of NUMBERS-LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14925 Optionally, HORIZONTAL-STEP, a positive integer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14926 specifies how much an X axis label increments for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14927 each column."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14928 ;; Value of symbol-width and full-Y-label-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14929 ;; are passed by `print-graph'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14930 (let* ((leading-spaces
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14931 (make-string full-Y-label-width ? ))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14932 ;; symbol-width is provided by graph-body-print
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14933 (tic-width (* symbol-width X-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14934 (X-length (length numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14935 (X-tic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14936 (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14937 (make-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14938 ;; Make a string of blanks.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14939 (- (* symbol-width X-axis-label-spacing)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14940 (length X-axis-tic-symbol))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14941 ? )
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14942 ;; Concatenate blanks with tic symbol.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14943 X-axis-tic-symbol))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14944 (tic-number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14945 (if (zerop (% X-length tic-width))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14946 (/ X-length tic-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14947 (1+ (/ X-length tic-width)))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14948
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14949 (print-X-axis-tic-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14950 tic-number leading-spaces X-tic)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14951 (insert "\n")
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14952 (print-X-axis-numbered-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14953 tic-number leading-spaces horizontal-step)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14954
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14955 (defun print-graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14956 (numbers-list &optional vertical-step horizontal-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14957 "Print labelled bar graph of the NUMBERS-LIST.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14958 The numbers-list consists of the Y-axis values.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14959
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14960 Optionally, VERTICAL-STEP, a positive integer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14961 specifies how much a Y axis label increments for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14962 each line. For example, a step of 5 means that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14963 each row is five units.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14964
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14965 Optionally, HORIZONTAL-STEP, a positive integer,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14966 specifies how much an X axis label increments for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14967 each column."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14968 (let* ((symbol-width (length graph-blank))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14969 ;; `height' is both the largest number
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14970 ;; and the number with the most digits.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14971 (height (apply 'max numbers-list))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14972 (height-of-top-line
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14973 (if (zerop (% height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14974 height
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14975 ;; else
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14976 (* (1+ (/ height Y-axis-label-spacing))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14977 Y-axis-label-spacing)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14978 (vertical-step (or vertical-step 1))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14979 (full-Y-label-width
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14980 (length
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14981 (concat
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14982 (number-to-string
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14983 (* height-of-top-line vertical-step))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14984 Y-axis-tic))))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14985 (print-Y-axis
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14986 height-of-top-line full-Y-label-width vertical-step)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14987 (graph-body-print
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14988 numbers-list height-of-top-line symbol-width)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14989 (print-X-axis numbers-list horizontal-step)))
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14990
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14991 The Printed Graph
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14992 -----------------
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14993
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14994 When made and installed, you can call the `print-graph' command like
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14995 this:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14996
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14997 (print-graph fiftieth-list-for-graph 50 10)
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14998
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
14999 Here is the graph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15000
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15001
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15002
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15003 1000 - *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15004 **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15005 **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15006 **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15007 **
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15008 750 - ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15009 ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15010 ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15011 ***
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15012 ****
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15013 500 - *****
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15014 ******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15015 ******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15016 ******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15017 *******
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15018 250 - ********
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15019 ********* *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15020 *********** *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15021 ************* *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15022 50 - ***************** * *
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15023 | | | | | | | |
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15024 10 50 100 150 200 250 300 350
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15025
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15026
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15027
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15028 The largest group of functions contain 10 - 19 words and symbols each.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15029
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15030 GNU Free Documentation License
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15031 ******************************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15032
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15033 Version 1.1, March 2000
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15034 Copyright (C) 2000 Free Software Foundation, Inc.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15035 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15036
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15037 Everyone is permitted to copy and distribute verbatim copies
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15038 of this license document, but changing it is not allowed.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15039
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15040 0. PREAMBLE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15041
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15042 The purpose of this License is to make a manual, textbook, or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15043 other written document "free" in the sense of freedom: to assure
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15044 everyone the effective freedom to copy and redistribute it, with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15045 or without modifying it, either commercially or noncommercially.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15046 Secondarily, this License preserves for the author and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15047 publisher a way to get credit for their work, while not being
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15048 considered responsible for modifications made by others.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15049
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15050 This License is a kind of "copyleft", which means that derivative
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15051 works of the document must themselves be free in the same sense.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15052 It complements the GNU General Public License, which is a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15053 copyleft license designed for free software.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15054
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15055 We have designed this License in order to use it for manuals for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15056 free software, because free software needs free documentation: a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15057 free program should come with manuals providing the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15058 freedoms that the software does. But this License is not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15059 limited to software manuals; it can be used for any textual
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15060 work, regardless of subject matter or whether it is published as
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15061 a printed book. We recommend this License principally for works
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15062 whose purpose is instruction or reference.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15063
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15064 1. APPLICABILITY AND DEFINITIONS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15065
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15066 This License applies to any manual or other work that contains a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15067 notice placed by the copyright holder saying it can be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15068 distributed under the terms of this License. The "Document",
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15069 below, refers to any such manual or work. Any member of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15070 public is a licensee, and is addressed as "you".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15071
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15072 A "Modified Version" of the Document means any work containing
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15073 the Document or a portion of it, either copied verbatim, or with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15074 modifications and/or translated into another language.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15075
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15076 A "Secondary Section" is a named appendix or a front-matter
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15077 section of the Document that deals exclusively with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15078 relationship of the publishers or authors of the Document to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15079 Document's overall subject (or to related matters) and contains
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15080 nothing that could fall directly within that overall subject.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15081 (For example, if the Document is in part a textbook of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15082 mathematics, a Secondary Section may not explain any
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15083 mathematics.) The relationship could be a matter of historical
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15084 connection with the subject or with related matters, or of legal,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15085 commercial, philosophical, ethical or political position
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15086 regarding them.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15087
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15088 The "Invariant Sections" are certain Secondary Sections whose
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15089 titles are designated, as being those of Invariant Sections, in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15090 the notice that says that the Document is released under this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15091 License.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15092
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15093 The "Cover Texts" are certain short passages of text that are
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15094 listed, as Front-Cover Texts or Back-Cover Texts, in the notice
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15095 that says that the Document is released under this License.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15096
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15097 A "Transparent" copy of the Document means a machine-readable
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15098 copy, represented in a format whose specification is available
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15099 to the general public, whose contents can be viewed and edited
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15100 directly and straightforwardly with generic text editors or (for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15101 images composed of pixels) generic paint programs or (for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15102 drawings) some widely available drawing editor, and that is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15103 suitable for input to text formatters or for automatic
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15104 translation to a variety of formats suitable for input to text
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15105 formatters. A copy made in an otherwise Transparent file format
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15106 whose markup has been designed to thwart or discourage
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15107 subsequent modification by readers is not Transparent. A copy
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15108 that is not "Transparent" is called "Opaque".
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15109
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15110 Examples of suitable formats for Transparent copies include plain
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15111 ASCII without markup, Texinfo input format, LaTeX input format,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15112 SGML or XML using a publicly available DTD, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15113 standard-conforming simple HTML designed for human modification.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15114 Opaque formats include PostScript, PDF, proprietary formats
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15115 that can be read and edited only by proprietary word processors,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15116 SGML or XML for which the DTD and/or processing tools are not
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15117 generally available, and the machine-generated HTML produced by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15118 some word processors for output purposes only.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15119
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15120 The "Title Page" means, for a printed book, the title page
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15121 itself, plus such following pages as are needed to hold,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15122 legibly, the material this License requires to appear in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15123 title page. For works in formats which do not have any title
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15124 page as such, "Title Page" means the text near the most
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15125 prominent appearance of the work's title, preceding the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15126 beginning of the body of the text.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15127
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15128 2. VERBATIM COPYING
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15129
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15130 You may copy and distribute the Document in any medium, either
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15131 commercially or noncommercially, provided that this License, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15132 copyright notices, and the license notice saying this License
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15133 applies to the Document are reproduced in all copies, and that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15134 you add no other conditions whatsoever to those of this License.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15135 You may not use technical measures to obstruct or control the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15136 reading or further copying of the copies you make or distribute.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15137 However, you may accept compensation in exchange for copies.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15138 If you distribute a large enough number of copies you must also
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15139 follow the conditions in section 3.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15140
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15141 You may also lend copies, under the same conditions stated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15142 above, and you may publicly display copies.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15143
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15144 3. COPYING IN QUANTITY
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15145
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15146 If you publish printed copies of the Document numbering more
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15147 than 100, and the Document's license notice requires Cover
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15148 Texts, you must enclose the copies in covers that carry, clearly
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15149 and legibly, all these Cover Texts: Front-Cover Texts on the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15150 front cover, and Back-Cover Texts on the back cover. Both
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15151 covers must also clearly and legibly identify you as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15152 publisher of these copies. The front cover must present the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15153 full title with all words of the title equally prominent and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15154 visible. You may add other material on the covers in addition.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15155 Copying with changes limited to the covers, as long as they
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15156 preserve the title of the Document and satisfy these conditions,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15157 can be treated as verbatim copying in other respects.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15158
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15159 If the required texts for either cover are too voluminous to fit
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15160 legibly, you should put the first ones listed (as many as fit
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15161 reasonably) on the actual cover, and continue the rest onto
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15162 adjacent pages.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15163
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15164 If you publish or distribute Opaque copies of the Document
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15165 numbering more than 100, you must either include a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15166 machine-readable Transparent copy along with each Opaque copy,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15167 or state in or with each Opaque copy a publicly-accessible
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15168 computer-network location containing a complete Transparent copy
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15169 of the Document, free of added material, which the general
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15170 network-using public has access to download anonymously at no
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15171 charge using public-standard network protocols. If you use the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15172 latter option, you must take reasonably prudent steps, when you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15173 begin distribution of Opaque copies in quantity, to ensure that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15174 this Transparent copy will remain thus accessible at the stated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15175 location until at least one year after the last time you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15176 distribute an Opaque copy (directly or through your agents or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15177 retailers) of that edition to the public.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15178
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15179 It is requested, but not required, that you contact the authors
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15180 of the Document well before redistributing any large number of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15181 copies, to give them a chance to provide you with an updated
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15182 version of the Document.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15183
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15184 4. MODIFICATIONS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15185
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15186 You may copy and distribute a Modified Version of the Document
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15187 under the conditions of sections 2 and 3 above, provided that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15188 you release the Modified Version under precisely this License,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15189 with the Modified Version filling the role of the Document, thus
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15190 licensing distribution and modification of the Modified Version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15191 to whoever possesses a copy of it. In addition, you must do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15192 these things in the Modified Version:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15193
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15194 A. Use in the Title Page (and on the covers, if any) a title
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15195 distinct from that of the Document, and from those of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15196 previous versions (which should, if there were any, be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15197 listed in the History section of the Document). You may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15198 use the same title as a previous version if the original
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15199 publisher of that version gives permission.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15200
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15201 B. List on the Title Page, as authors, one or more persons or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15202 entities responsible for authorship of the modifications in
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15203 the Modified Version, together with at least five of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15204 principal authors of the Document (all of its principal
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15205 authors, if it has less than five).
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15206
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15207 C. State on the Title page the name of the publisher of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15208 Modified Version, as the publisher.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15209
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15210 D. Preserve all the copyright notices of the Document.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15211
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15212 E. Add an appropriate copyright notice for your modifications
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15213 adjacent to the other copyright notices.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15214
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15215 F. Include, immediately after the copyright notices, a license
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15216 notice giving the public permission to use the Modified
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15217 Version under the terms of this License, in the form shown
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15218 in the Addendum below.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15219
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15220 G. Preserve in that license notice the full lists of Invariant
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15221 Sections and required Cover Texts given in the Document's
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15222 license notice.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15223
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15224 H. Include an unaltered copy of this License.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15225
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15226 I. Preserve the section entitled "History", and its title, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15227 add to it an item stating at least the title, year, new
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15228 authors, and publisher of the Modified Version as given on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15229 the Title Page. If there is no section entitled "History"
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15230 in the Document, create one stating the title, year,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15231 authors, and publisher of the Document as given on its
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15232 Title Page, then add an item describing the Modified
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15233 Version as stated in the previous sentence.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15234
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15235 J. Preserve the network location, if any, given in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15236 Document for public access to a Transparent copy of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15237 Document, and likewise the network locations given in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15238 Document for previous versions it was based on. These may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15239 be placed in the "History" section. You may omit a network
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15240 location for a work that was published at least four years
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15241 before the Document itself, or if the original publisher of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15242 the version it refers to gives permission.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15243
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15244 K. In any section entitled "Acknowledgments" or "Dedications",
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15245 preserve the section's title, and preserve in the section
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15246 all the substance and tone of each of the contributor
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15247 acknowledgments and/or dedications given therein.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15248
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15249 L. Preserve all the Invariant Sections of the Document,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15250 unaltered in their text and in their titles. Section
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15251 numbers or the equivalent are not considered part of the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15252 section titles.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15253
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15254 M. Delete any section entitled "Endorsements". Such a section
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15255 may not be included in the Modified Version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15256
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15257 N. Do not retitle any existing section as "Endorsements" or to
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15258 conflict in title with any Invariant Section.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15259
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15260 If the Modified Version includes new front-matter sections or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15261 appendices that qualify as Secondary Sections and contain no
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15262 material copied from the Document, you may at your option
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15263 designate some or all of these sections as invariant. To do
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15264 this, add their titles to the list of Invariant Sections in the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15265 Modified Version's license notice. These titles must be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15266 distinct from any other section titles.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15267
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15268 You may add a section entitled "Endorsements", provided it
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15269 contains nothing but endorsements of your Modified Version by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15270 various parties--for example, statements of peer review or that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15271 the text has been approved by an organization as the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15272 authoritative definition of a standard.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15273
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15274 You may add a passage of up to five words as a Front-Cover Text,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15275 and a passage of up to 25 words as a Back-Cover Text, to the end
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15276 of the list of Cover Texts in the Modified Version. Only one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15277 passage of Front-Cover Text and one of Back-Cover Text may be
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15278 added by (or through arrangements made by) any one entity. If
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15279 the Document already includes a cover text for the same cover,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15280 previously added by you or by arrangement made by the same
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15281 entity you are acting on behalf of, you may not add another; but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15282 you may replace the old one, on explicit permission from the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15283 previous publisher that added the old one.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15284
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15285 The author(s) and publisher(s) of the Document do not by this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15286 License give permission to use their names for publicity for or
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15287 to assert or imply endorsement of any Modified Version.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15288
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15289 5. COMBINING DOCUMENTS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15290
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15291 You may combine the Document with other documents released under
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15292 this License, under the terms defined in section 4 above for
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15293 modified versions, provided that you include in the combination
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15294 all of the Invariant Sections of all of the original documents,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15295 unmodified, and list them all as Invariant Sections of your
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15296 combined work in its license notice.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15297
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15298 The combined work need only contain one copy of this License, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15299 multiple identical Invariant Sections may be replaced with a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15300 single copy. If there are multiple Invariant Sections with the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15301 same name but different contents, make the title of each such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15302 section unique by adding at the end of it, in parentheses, the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15303 name of the original author or publisher of that section if
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15304 known, or else a unique number. Make the same adjustment to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15305 section titles in the list of Invariant Sections in the license
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15306 notice of the combined work.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15307
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15308 In the combination, you must combine any sections entitled
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15309 "History" in the various original documents, forming one section
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15310 entitled "History"; likewise combine any sections entitled
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15311 "Acknowledgments", and any sections entitled "Dedications". You
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15312 must delete all sections entitled "Endorsements."
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15313
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15314 6. COLLECTIONS OF DOCUMENTS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15315
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15316 You may make a collection consisting of the Document and other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15317 documents released under this License, and replace the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15318 individual copies of this License in the various documents with
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15319 a single copy that is included in the collection, provided that
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15320 you follow the rules of this License for verbatim copying of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15321 each of the documents in all other respects.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15322
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15323 You may extract a single document from such a collection, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15324 distribute it individually under this License, provided you
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15325 insert a copy of this License into the extracted document, and
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15326 follow this License in all other respects regarding verbatim
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15327 copying of that document.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15328
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15329 7. AGGREGATION WITH INDEPENDENT WORKS
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15330
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15331 A compilation of the Document or its derivatives with other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15332 separate and independent documents or works, in or on a volume
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15333 of a storage or distribution medium, does not as a whole count
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15334 as a Modified Version of the Document, provided no compilation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15335 copyright is claimed for the compilation. Such a compilation is
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15336 called an "aggregate", and this License does not apply to the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15337 other self-contained works thus compiled with the Document, on
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15338 account of their being thus compiled, if they are not themselves
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15339 derivative works of the Document.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15340
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15341 If the Cover Text requirement of section 3 is applicable to these
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15342 copies of the Document, then if the Document is less than one
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15343 quarter of the entire aggregate, the Document's Cover Texts may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15344 be placed on covers that surround only the Document within the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15345 aggregate. Otherwise they must appear on covers around the
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15346 whole aggregate.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15347
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15348 8. TRANSLATION
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15349
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15350 Translation is considered a kind of modification, so you may
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15351 distribute translations of the Document under the terms of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15352 section 4. Replacing Invariant Sections with translations
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15353 requires special permission from their copyright holders, but
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15354 you may include translations of some or all Invariant Sections
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15355 in addition to the original versions of these Invariant
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15356 Sections. You may include a translation of this License
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15357 provided that you also include the original English version of
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15358 this License. In case of a disagreement between the translation
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15359 and the original English version of this License, the original
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15360 English version will prevail.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15361
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15362 9. TERMINATION
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15363
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15364 You may not copy, modify, sublicense, or distribute the Document
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15365 except as expressly provided for under this License. Any other
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15366 attempt to copy, modify, sublicense or distribute the Document
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15367 is void, and will automatically terminate your rights under this
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15368 License. However, parties who have received copies, or rights,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15369 from you under this License will not have their licenses
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15370 terminated so long as such parties remain in full compliance.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15371
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15372 10. FUTURE REVISIONS OF THIS LICENSE
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15373
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15374 The Free Software Foundation may publish new, revised versions
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15375 of the GNU Free Documentation License from time to time. Such
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15376 new versions will be similar in spirit to the present version,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15377 but may differ in detail to address new problems or concerns.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15378 See `http://www.gnu.org/copyleft/'.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15379
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15380 Each version of the License is given a distinguishing version
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15381 number. If the Document specifies that a particular numbered
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15382 version of this License "or any later version" applies to it,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15383 you have the option of following the terms and conditions either
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15384 of that specified version or of any later version that has been
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15385 published (not as a draft) by the Free Software Foundation. If
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15386 the Document does not specify a version number of this License,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15387 you may choose any version ever published (not as a draft) by
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15388 the Free Software Foundation.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15389
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15390 Index
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15391 *****
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15392
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15393 % (remainder function):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15394 See ``Side Trip: Compute a Remainder''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15395 (debug) in code:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15396 See ```debug-on-quit' and `(debug)'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15397 * (multiplication):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15398 See ``The `defun' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15399 * for read-only buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15400 See ``A Read-only Buffer''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15401 *scratch* buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15402 See ``An Example: `print-elements-of-list'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15403 .emacs file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15404 See ``Your `.emacs' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15405 .emacs file, beginning of:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15406 See ``Beginning a `.emacs' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15407 / (division):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15408 See ``What happens in a large buffer''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15409 <= (less than or equal):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15410 See ``The parts of the function definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15411 > (greater than):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15412 See ```if' in more detail''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15413 Accumulate, type of recursive pattern:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15414 See ``Recursive Pattern: _accumulate_''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15415 add-hook:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15416 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15417 and <1>:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15418 See ``The `let*' expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15419 and:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15420 See ``The `kill-new' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15421 and, introduced:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15422 See ``The `kill-new' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15423 Anonymous function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15424 See ``A `lambda' Expression: Useful Anonymity''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15425 append-to-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15426 See ``The Definition of `append-to-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15427 apply:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15428 See ``Printing the Columns of a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15429 apropos:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15430 See ``Printing the Columns of a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15431 Argument as local variable:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15432 See ``Putting the function definition together''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15433 argument defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15434 See ``Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15435 argument list defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15436 See ``The `defun' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15437 Argument, wrong type of:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15438 See ``Using the Wrong Type Object as an Argument''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15439 Arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15440 See ``Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15441 Arguments' data types:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15442 See ``Arguments' Data Types''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15443 Arguments, variable number of:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15444 See ``Variable Number of Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15445 Asterisk for read-only buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15446 See ``A Read-only Buffer''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15447 Auto Fill mode turned on:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15448 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15449 autoload:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15450 See ``Autoloading''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15451 Automatic mode selection:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15452 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15453 Axis, print horizontal:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15454 See ``The `print-X-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15455 Axis, print vertical:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15456 See ``The `print-Y-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15457 beginning-of-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15458 See ``Complete Definition of `beginning-of-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15459 bind defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15460 See ``Setting the Value of a Variable''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15461 body defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15462 See ``The `defun' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15463 Body of graph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15464 See ``Readying a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15465 Buffer size:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15466 See ``Buffer Size and the Location of Point''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15467 Buffer, history of word:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15468 See ``Buffer Names''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15469 buffer-file-name:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15470 See ``Buffer Names''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15471 buffer-menu, bound to key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15472 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15473 buffer-name:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15474 See ``Buffer Names''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15475 Bug, most insidious type:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15476 See ``Another Bug ... Most Insidious''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15477 Building robots:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15478 See ``Building Robots: Extending the Metaphor''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15479 Building Tags in the Emacs sources:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15480 See ``Create Your Own `TAGS' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15481 Byte compiling:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15482 See ``Byte Compiling''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15483 C language primitives:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15484 See ``An Aside about Primitive Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15485 C, a digression into:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15486 See ``Digression into C''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15487 call defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15488 See ``Switching Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15489 cancel-debug-on-entry:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15490 See ```debug-on-entry'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15491 car, introduced:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15492 See ```car', `cdr', `cons': Fundamental Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15493 cdr, introduced:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15494 See ```car', `cdr', `cons': Fundamental Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15495 Changing a function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15496 See ``Change a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15497 Chest of Drawers, metaphor for a symbol:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15498 See ``Symbols as a Chest of Drawers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15499 Clipping text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15500 See ``Cutting and Storing Text''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15501 Code installation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15502 See ``Install Code Permanently''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15503 command defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15504 See ``How to Evaluate''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15505 Comments in Lisp code:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15506 See ``Change a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15507 Common Lisp:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15508 See ``Lisp History''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15509 compare-windows:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15510 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15511 concat:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15512 See ``Arguments' Data Types''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15513 cond:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15514 See ``Recursion Example Using `cond'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15515 condition-case:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15516 See ```condition-case'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15517 Conditional 'twixt two versions of Emacs:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15518 See ``A Simple Extension: `line-to-top-of-window'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15519 Conditional with if:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15520 See ``The `if' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15521 cons, example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15522 See ``The `kill-new' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15523 cons, introduced:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15524 See ```cons'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15525 copy-region-as-kill:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15526 See ```copy-region-as-kill'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15527 copy-to-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15528 See ``The Definition of `copy-to-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15529 Count words recursively:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15530 See ``Count Words Recursively''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15531 count-words-in-defun:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15532 See ``The `count-words-in-defun' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15533 count-words-region:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15534 See ``The `count-words-region' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15535 Counting:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15536 See ``Counting''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15537 Counting words in a defun <1>:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15538 See ``The `count-words-in-defun' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15539 Counting words in a defun:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15540 See ``Counting Words in a `defun'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15541 current-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15542 See ``Getting Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15543 Customizing your .emacs file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15544 See ``Your `.emacs' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15545 Cutting and storing text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15546 See ``Cutting and Storing Text''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15547 Data types:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15548 See ``Arguments' Data Types''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15549 debug:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15550 See ```debug'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15551 debug-on-entry:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15552 See ```debug-on-entry'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15553 debug-on-quit:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15554 See ```debug-on-quit' and `(debug)'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15555 debugging:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15556 See ``Debugging''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15557 default-mode-line-format:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15558 See ``A Modified Mode Line''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15559 default.el init file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15560 See ``Site-wide Initialization Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15561 defcustom:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15562 See ``Specifying Variables using `defcustom'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15563 Deferment in recursion:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15564 See ``Recursion without Deferments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15565 Defermentless solution:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15566 See ``No Deferment Solution''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15567 Definition installation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15568 See ``Install a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15569 Definition writing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15570 See ``How To Write Function Definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15571 Definition, how to change:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15572 See ``Change a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15573 defun:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15574 See ``The `defun' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15575 defvar:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15576 See ``Initializing a Variable with `defvar'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15577 defvar for a user customizable variable:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15578 See ```defvar' and an asterisk''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15579 defvar with an asterisk:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15580 See ```defvar' and an asterisk''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15581 delete-and-extract-region <1>:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15582 See ``Digression into C''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15583 delete-and-extract-region:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15584 See ```delete-and-extract-region'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15585 Deleting text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15586 See ``Cutting and Storing Text''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15587 describe-function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15588 See ``A Simplified `beginning-of-buffer' Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15589 describe-function, introduced:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15590 See ``Finding More Information''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15591 Digression into C:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15592 See ``Digression into C''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15593 directory-files:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15594 See ``Making a List of Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15595 Division:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15596 See ``What happens in a large buffer''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15597 dolist:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15598 See ``The `dolist' Macro''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15599 dotimes:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15600 See ``The `dotimes' Macro''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15601 Drawers, Chest of, metaphor for a symbol:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15602 See ``Symbols as a Chest of Drawers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15603 Duplicated words function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15604 See ``The `the-the' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15605 edebug:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15606 See ``The `edebug' Source Level Debugger''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15607 edit-options:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15608 See ```defvar' and an asterisk''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15609 Else:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15610 See ``If-then-else Expressions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15611 Emacs version, choosing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15612 See ``A Simple Extension: `line-to-top-of-window'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15613 empty list defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15614 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15615 empty string defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15616 See ``Review''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15617 eobp:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15618 See ``Between paragraphs''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15619 eq:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15620 See ``Review''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15621 eq (example of use):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15622 See ```last-command' and `this-command'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15623 equal:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15624 See ``Review''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15625 Erasing text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15626 See ``Cutting and Storing Text''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15627 error:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15628 See ``The Body of `rotate-yank-pointer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15629 Error for symbol without function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15630 See ``Error Message for a Symbol Without a Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15631 Error for symbol without value:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15632 See ``Error Message for a Symbol Without a Value''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15633 Error message generation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15634 See ``Generate an Error Message''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15635 etags:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15636 See ``Create Your Own `TAGS' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15637 evaluate defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15638 See ``Run a Program''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15639 Evaluating inner lists:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15640 See ``Evaluating Inner Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15641 Evaluation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15642 See ``Evaluation''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15643 Evaluation practice:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15644 See ``Practicing Evaluation''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15645 Every, type of recursive pattern:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15646 See ``Recursive Pattern: _every_''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15647 Example variable, fill-column:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15648 See ```fill-column', an Example Variable''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15649 expression defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15650 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15651 Falsehood and truth in Emacs Lisp:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15652 See ``Truth and Falsehood in Emacs Lisp''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15653 FDL, GNU Free Documentation License:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15654 See ``GNU Free Documentation License''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15655 files-in-below-directory:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15656 See ``Making a List of Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15657 fill-column, an example variable:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15658 See ```fill-column', an Example Variable''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15659 Find a File:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15660 See ``Find a File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15661 Find function documentation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15662 See ``Finding More Information''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15663 Find source of function:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15664 See ``Finding More Information''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15665 find-tags:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15666 See ``Finding More Information''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15667 Flowers in a field:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15668 See ``Lisp Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15669 Focusing attention (narrowing):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15670 See ``Narrowing and Widening''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15671 form defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15672 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15673 Formatting convention:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15674 See ```save-excursion' in `append-to-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15675 Formatting help:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15676 See ``GNU Emacs Helps You Type Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15677 forward-paragraph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15678 See ```forward-paragraph': a Goldmine of Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15679 forward-sentence:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15680 See ```forward-sentence'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15681 function defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15682 See ``Generate an Error Message''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15683 function definition defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15684 See ``The `defun' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15685 Function definition installation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15686 See ``Install a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15687 Function definition writing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15688 See ``How To Write Function Definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15689 Function definition, how to change:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15690 See ``Change a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15691 Functions, primitive:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15692 See ``An Aside about Primitive Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15693 Generate an error message:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15694 See ``Generate an Error Message''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15695 Getting a buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15696 See ``Getting Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15697 Global set key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15698 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15699 global-set-key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15700 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15701 global-unset-key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15702 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15703 Graph prototype:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15704 See ``Readying a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15705 Graph, printing all:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15706 See ``Printing the Whole Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15707 graph-body-print:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15708 See ``The `graph-body-print' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15709 graph-body-print Final version.:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15710 See ``Changes for the Final Version''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15711 Handling the kill ring:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15712 See ``Handling the Kill Ring''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15713 Help typing lists:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15714 See ``GNU Emacs Helps You Type Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15715 Horizontal axis printing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15716 See ``The `print-X-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15717 if:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15718 See ``The `if' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15719 if-part defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15720 See ```if' in more detail''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15721 indent-tabs-mode:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15722 See ``Indent Tabs Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15723 Indentation for formatting:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15724 See ```save-excursion' in `append-to-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15725 Initialization file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15726 See ``Your `.emacs' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15727 Initializing a variable:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15728 See ``Initializing a Variable with `defvar'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15729 Inner list evaluation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15730 See ``Evaluating Inner Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15731 insert-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15732 See ``The Definition of `insert-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15733 insert-buffer-substring:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15734 See ``An Overview of `append-to-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15735 Insidious type of bug:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15736 See ``Another Bug ... Most Insidious''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15737 Install a Function Definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15738 See ``Install a Function Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15739 Install code permanently:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15740 See ``Install Code Permanently''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15741 interactive:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15742 See ``Make a Function Interactive''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15743 interactive function defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15744 See ``How to Evaluate''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15745 Interactive functions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15746 See ``Make a Function Interactive''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15747 Interactive options:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15748 See ``Different Options for `interactive'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15749 interactive, example use of:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15750 See ``The Interactive Expression in `insert-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15751 Interpreter, Lisp, explained:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15752 See ``Run a Program''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15753 Interpreter, what it does:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15754 See ``The Lisp Interpreter''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15755 Keep, type of recursive pattern:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15756 See ``Recursive Pattern: _keep_''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15757 Key setting globally:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15758 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15759 Key unbinding:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15760 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15761 Keymaps:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15762 See ``Keymaps''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15763 Keyword:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15764 See ``Optional Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15765 Kill ring handling:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15766 See ``Handling the Kill Ring''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15767 Kill ring overview:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15768 See ``Kill Ring Overview''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15769 kill-append:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15770 See ``The `kill-append' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15771 kill-new:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15772 See ``The `kill-new' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15773 kill-region:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15774 See ```kill-region'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15775 Killing text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15776 See ``Cutting and Storing Text''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15777 lambda:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15778 See ``A `lambda' Expression: Useful Anonymity''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15779 length:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15780 See ``Find the Length of a List: `length'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15781 lengths-list-file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15782 See ```lengths-list-file' in Detail''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15783 lengths-list-many-files:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15784 See ``Determine the lengths of `defuns'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15785 let:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15786 See ```let'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15787 let expression sample:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15788 See ``Sample `let' Expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15789 let expression, parts of:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15790 See ``The Parts of a `let' Expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15791 let variables uninitialized:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15792 See ``Uninitialized Variables in a `let' Statement''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15793 Library, as term for `file':
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15794 See ``Finding More Information''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15795 line-to-top-of-window:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15796 See ``A Simple Extension: `line-to-top-of-window'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15797 Lisp Atoms:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15798 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15799 Lisp history:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15800 See ``Lisp History''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15801 Lisp interpreter, explained:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15802 See ``Run a Program''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15803 Lisp interpreter, what it does:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15804 See ``The Lisp Interpreter''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15805 Lisp Lists:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15806 See ``Lisp Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15807 Lisp macro:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15808 See ```delete-and-extract-region'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15809 list-buffers, rebound:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15810 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15811 Lists in a computer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15812 See ``How Lists are Implemented''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15813 load-library:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15814 See ``Loading Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15815 load-path:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15816 See ``Loading Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15817 Loading files:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15818 See ``Loading Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15819 local variable defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15820 See ```let' Prevents Confusion''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15821 Local variables list, per-buffer,:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15822 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15823 Location of point:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15824 See ``Buffer Size and the Location of Point''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15825 looking-at:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15826 See ``Between paragraphs''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15827 Loops:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15828 See ```while'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15829 Loops and recursion:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15830 See ``Loops and Recursion''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15831 Maclisp:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15832 See ``Lisp History''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15833 Macro, lisp:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15834 See ```delete-and-extract-region'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15835 Mail aliases:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15836 See ``Mail Aliases''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15837 make tags:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15838 See ``Create Your Own `TAGS' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15839 make-string:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15840 See ``Construct a Y Axis Element''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15841 mapcar:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15842 See ``The `mapcar' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15843 mark:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15844 See ```save-excursion'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15845 mark-whole-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15846 See ``The Definition of `mark-whole-buffer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15847 match-beginning:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15848 See ``No fill prefix''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15849 max:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15850 See ``Printing the Columns of a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15851 message:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15852 See ``The `message' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15853 min:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15854 See ``Printing the Columns of a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15855 Mode line format:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15856 See ``A Modified Mode Line''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15857 Mode selection, automatic:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15858 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15859 Motion by sentence and paragraph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15860 See ``Regular Expression Searches''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15861 Narrowing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15862 See ``Narrowing and Widening''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15863 narrowing defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15864 See ``Buffer Size and the Location of Point''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15865 nil:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15866 See ``Truth and Falsehood in Emacs Lisp''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15867 nil, history of word:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15868 See ``Buffer Names''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15869 No deferment solution:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15870 See ``No Deferment Solution''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15871 nreverse:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15872 See ``Counting function definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15873 nth:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15874 See ```nth'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15875 nthcdr <1>:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15876 See ```copy-region-as-kill'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15877 nthcdr:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15878 See ```nthcdr'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15879 nthcdr, example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15880 See ``The `kill-new' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15881 number-to-string:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15882 See ``Construct a Y Axis Element''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15883 occur:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15884 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15885 optional:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15886 See ``Optional Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15887 Optional arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15888 See ``Optional Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15889 Options for interactive:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15890 See ``Different Options for `interactive'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15891 or:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15892 See ``The `or' in the Body''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15893 other-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15894 See ``Getting Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15895 Paragraphs, movement by:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15896 See ``Regular Expression Searches''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15897 Parts of a Recursive Definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15898 See ``The Parts of a Recursive Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15899 Parts of let expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15900 See ``The Parts of a `let' Expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15901 Passing information to functions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15902 See ``Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15903 Pasting text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15904 See ``Yanking Text Back''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15905 Patterns, searching for:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15906 See ``Regular Expression Searches''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15907 Per-buffer, local variables list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15908 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15909 Permanent code installation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15910 See ``Install Code Permanently''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15911 point:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15912 See ```save-excursion'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15913 point defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15914 See ``Buffer Size and the Location of Point''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15915 Point location:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15916 See ``Buffer Size and the Location of Point''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15917 Point, mark, buffer preservation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15918 See ```save-excursion'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15919 Practicing evaluation:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15920 See ``Practicing Evaluation''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15921 Preserving point, mark, and buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15922 See ```save-excursion'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15923 Primitive functions:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15924 See ``An Aside about Primitive Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15925 Primitives written in C:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15926 See ``An Aside about Primitive Functions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15927 Print horizontal axis:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15928 See ``The `print-X-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15929 Print vertical axis:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15930 See ``The `print-Y-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15931 print-elements-of-list:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15932 See ``An Example: `print-elements-of-list'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15933 print-elements-recursively:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15934 See ``Recursion with a List''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15935 print-graph Final version.:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15936 See ``Changes for the Final Version''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15937 print-graph varlist:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15938 See ``The `print-graph' Varlist''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15939 print-X-axis:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15940 See ``X Axis Tic Marks''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15941 print-X-axis-numbered-line:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15942 See ``X Axis Tic Marks''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15943 print-X-axis-tic-line:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15944 See ``X Axis Tic Marks''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15945 print-Y-axis:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15946 See ``The Not Quite Final Version of `print-Y-axis'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15947 Printing the whole graph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15948 See ``Printing the Whole Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15949 prog1:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15950 See ``Between paragraphs''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15951 progn:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15952 See ``The `progn' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15953 Program, running one:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15954 See ``Run a Program''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15955 Prototype graph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15956 See ``Readying a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15957 re-search-forward:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15958 See ``The `re-search-forward' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15959 Read-only buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15960 See ``A Read-only Buffer''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15961 Readying a graph:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15962 See ``Readying a Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15963 Rebinding keys:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15964 See ``Keymaps''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15965 Recursion:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15966 See ``Recursion''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15967 Recursion and loops:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15968 See ``Loops and Recursion''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15969 Recursion without Deferments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15970 See ``Recursion without Deferments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15971 Recursive Definition Parts:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15972 See ``The Parts of a Recursive Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15973 Recursive pattern: accumulate:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15974 See ``Recursive Pattern: _accumulate_''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15975 Recursive pattern: every:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15976 See ``Recursive Pattern: _every_''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15977 Recursive pattern: keep:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15978 See ``Recursive Pattern: _keep_''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15979 Recursive Patterns:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15980 See ``Recursive Patterns''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15981 recursive-count-words:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15982 See ``Count Words Recursively''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15983 recursive-graph-body-print:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15984 See ``The `recursive-graph-body-print' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15985 recursive-lengths-list-many-files:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15986 See ``Recursively Count Words in Different Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15987 Recursively counting words:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15988 See ``Count Words Recursively''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15989 regexp-quote:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15990 See ``The `let*' expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15991 Region, what it is:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15992 See ```save-excursion'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15993 Regular expression searches:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15994 See ``Regular Expression Searches''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15995 Regular expressions for word counting:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15996 See ``Counting: Repetition and Regexps''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15997 Remainder function, %:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15998 See ``Side Trip: Compute a Remainder''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
15999 Repetition (loops):
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16000 See ``Loops and Recursion''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16001 Repetition for word counting:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16002 See ``Counting: Repetition and Regexps''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16003 Retrieving text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16004 See ``Yanking Text Back''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16005 reverse:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16006 See ``Counting function definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16007 Ring, making a list like a:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16008 See ``Handling the Kill Ring''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16009 Robots, building:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16010 See ``Building Robots: Extending the Metaphor''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16011 rotate-yank-pointer <1>:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16012 See ``The `rotate-yank-pointer' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16013 rotate-yank-pointer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16014 See ``Yanking Text Back''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16015 Run a program:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16016 See ``Run a Program''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16017 Sample let expression:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16018 See ``Sample `let' Expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16019 save-excursion:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16020 See ```save-excursion'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16021 save-restriction:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16022 See ``The `save-restriction' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16023 search-forward:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16024 See ``The `search-forward' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16025 Searches, illustrating:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16026 See ``Regular Expression Searches''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16027 sentence-end:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16028 See ``The Regular Expression for `sentence-end'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16029 Sentences, movement by:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16030 See ``Regular Expression Searches''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16031 set:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16032 See ``Using `set'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16033 set-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16034 See ``Switching Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16035 setcar:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16036 See ```setcar'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16037 setcdr:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16038 See ```setcdr'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16039 setcdr, example:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16040 See ``The `kill-new' function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16041 setq:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16042 See ``Using `setq'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16043 Setting a key globally:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16044 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16045 Setting value of variable:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16046 See ``Setting the Value of a Variable''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16047 side effect defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16048 See ``Evaluation''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16049 Simple extension in .emacs file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16050 See ``A Simple Extension: `line-to-top-of-window'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16051 simplified-beginning-of-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16052 See ``A Simplified `beginning-of-buffer' Definition''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16053 site-init.el init file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16054 See ``Site-wide Initialization Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16055 site-load.el init file:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16056 See ``Site-wide Initialization Files''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16057 Size of buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16058 See ``Buffer Size and the Location of Point''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16059 Solution without deferment:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16060 See ``No Deferment Solution''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16061 sort:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16062 See ``Sorting Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16063 Source level debugger:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16064 See ``The `edebug' Source Level Debugger''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16065 Special form:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16066 See ``Complications''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16067 Special form of defun:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16068 See ``The `defun' Special Form''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16069 Storing and cutting text:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16070 See ``Cutting and Storing Text''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16071 string defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16072 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16073 switch-to-buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16074 See ``Switching Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16075 Switching to a buffer:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16076 See ``Switching Buffers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16077 Symbol names:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16078 See ``Symbol Names and Function Definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16079 Symbol without function error:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16080 See ``Error Message for a Symbol Without a Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16081 Symbol without value error:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16082 See ``Error Message for a Symbol Without a Value''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16083 Symbolic expressions, introduced:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16084 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16085 Symbols as a Chest of Drawers:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16086 See ``Symbols as a Chest of Drawers''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16087 Syntax categories and tables:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16088 See ``What Constitutes a Word or Symbol?''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16089 Tabs, preventing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16090 See ``Indent Tabs Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16091 TAGS file, create own:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16092 See ``Create Your Own `TAGS' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16093 Tags in the Emacs sources:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16094 See ``Create Your Own `TAGS' File''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16095 TAGS table, specifying:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16096 See ``Finding More Information''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16097 Text between double quotation marks:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16098 See ``Lisp Atoms''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16099 Text Mode turned on:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16100 See ``Text and Auto Fill Mode''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16101 Text retrieval:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16102 See ``Yanking Text Back''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16103 the-the:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16104 See ``The `the-the' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16105 then-part defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16106 See ```if' in more detail''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16107 top-of-ranges:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16108 See ``Counting function definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16109 triangle-bugged:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16110 See ```debug'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16111 triangle-recursively:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16112 See ``Recursion in Place of a Counter''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16113 Truth and falsehood in Emacs Lisp:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16114 See ``Truth and Falsehood in Emacs Lisp''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16115 Types of data:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16116 See ``Arguments' Data Types''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16117 Unbinding key:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16118 See ``Some Keybindings''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16119 Uninitialized let variables:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16120 See ``Uninitialized Variables in a `let' Statement''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16121 Variable initialization:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16122 See ``Initializing a Variable with `defvar'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16123 Variable number of arguments:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16124 See ``Variable Number of Arguments''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16125 Variable, example of, fill-column:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16126 See ```fill-column', an Example Variable''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16127 Variable, setting value:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16128 See ``Setting the Value of a Variable''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16129 Variables:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16130 See ``Variables''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16131 varlist defined:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16132 See ``The Parts of a `let' Expression''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16133 Version of Emacs, choosing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16134 See ``A Simple Extension: `line-to-top-of-window'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16135 Vertical axis printing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16136 See ``The `print-Y-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16137 what-line:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16138 See ```what-line'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16139 while:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16140 See ```while'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16141 Whitespace in lists:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16142 See ``Whitespace in Lists''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16143 Whole graph printing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16144 See ``Printing the Whole Graph''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16145 Widening:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16146 See ``Narrowing and Widening''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16147 Widening, example of:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16148 See ```what-line'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16149 Word counting in a defun:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16150 See ``Counting Words in a `defun'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16151 Words and symbols in defun:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16152 See ``What to Count?''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16153 Words, counted recursively:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16154 See ``Count Words Recursively''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16155 Words, duplicated:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16156 See ``The `the-the' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16157 Writing a function definition:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16158 See ``How To Write Function Definitions''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16159 Wrong type of argument:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16160 See ``Using the Wrong Type Object as an Argument''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16161 X axis printing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16162 See ``The `print-X-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16163 X-axis-element:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16164 See ``X Axis Tic Marks''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16165 Y axis printing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16166 See ``The `print-Y-axis' Function''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16167 Y-axis-column:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16168 See ``Create a Y Axis Column''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16169 Y-axis-column Final version.:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16170 See ``Changes for the Final Version''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16171 Y-axis-label-spacing:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16172 See ``Side Trip: Compute a Remainder''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16173 Y-axis-tic:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16174 See ``Construct a Y Axis Element''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16175 yank <1>:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16176 See ```yank'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16177 yank:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16178 See ``Yanking Text Back''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16179 yank-pop:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16180 See ```yank-pop'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16181 zap-to-char:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16182 See ```zap-to-char'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16183 zerop:
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16184 See ``The Body of `rotate-yank-pointer'''.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16185 About the Author
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16186 ****************
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16187
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16188 Robert J. Chassell has worked with GNU Emacs since 1985. He
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16189 writes and edits, teaches Emacs and Emacs Lisp, and speaks
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16190 throughout the world on software freedom. Chassell was a
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16191 founding Director and Treasurer of the Free Software Foundation,
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16192 Inc. He is co-author of the `Texinfo' manual, and has edited
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16193 more than a dozen other books. He graduated from Cambridge
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16194 University, in England. He has an abiding interest in social
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16195 and economic history and flies his own airplane.
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16196
724e287f33a3 Update for Texinfo version 4.2
Robert J. Chassell <bob@rattlesnake.com>
parents:
diff changeset
16197