aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert J. Chassell2006-10-31 17:00:54 +0000
committerRobert J. Chassell2006-10-31 17:00:54 +0000
commit0fc9a22bf20359d00fd5997638c93a475a8e8fba (patch)
tree4a95e05e0048e835bdee91bd1c5d5c12e50f3694
parent58c57150a8578ac31eed62d96c07958cb5c084e0 (diff)
downloademacs-0fc9a22bf20359d00fd5997638c93a475a8e8fba.tar.gz
emacs-0fc9a22bf20359d00fd5997638c93a475a8e8fba.zip
info/eintr-3: Updated Info file to Third Edition for
`Introduction to Programming in Emacs Lisp'
-rw-r--r--info/eintr-32743
1 files changed, 2743 insertions, 0 deletions
diff --git a/info/eintr-3 b/info/eintr-3
new file mode 100644
index 00000000000..8c5b0583a43
--- /dev/null
+++ b/info/eintr-3
@@ -0,0 +1,2743 @@
1This is ../info/eintr, produced by makeinfo version 4.8 from
2emacs-lisp-intro.texi.
3
4INFO-DIR-SECTION Emacs
5START-INFO-DIR-ENTRY
6* Emacs Lisp Intro: (eintr).
7 A simple introduction to Emacs Lisp programming.
8END-INFO-DIR-ENTRY
9
10This is an `Introduction to Programming in Emacs Lisp', for people who
11are not programmers.
12
13Edition 3.00, 2006 Oct 31
14
15Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1997, 2001, 2002,
162003, 2004, 2005, 2006 Free Software Foundation, Inc.
17
18Published by the:
19
20 GNU Press, Website: http://www.gnupress.org
21 a division of the General: press@gnu.org
22 Free Software Foundation, Inc. Orders: sales@gnu.org
23 51 Franklin Street, Fifth Floor Tel: +1 (617) 542-5942
24 Boston, MA 02110-1301 USA Fax: +1 (617) 542-2652
25
26
27ISBN 1-882114-43-4
28
29Permission is granted to copy, distribute and/or modify this document
30under the terms of the GNU Free Documentation License, Version 1.2 or
31any later version published by the Free Software Foundation; there
32being no Invariant Section, with the Front-Cover Texts being "A GNU
33Manual", and with the Back-Cover Texts as in (a) below. A copy of the
34license is included in the section entitled "GNU Free Documentation
35License".
36
37(a) The FSF's Back-Cover Text is: "You have freedom to copy and modify
38this GNU Manual, like GNU software. Copies published by the Free
39Software Foundation raise funds for GNU development."
40
41
42File: eintr, Node: Understanding current-kill, Prev: current-kill, Up: current-kill
43
44`current-kill' in Outline
45-------------------------
46
47The `current-kill' function looks complex, but as usual, it can be
48understood by taking it apart piece by piece. First look at it in
49skeletal form:
50
51 (defun current-kill (n &optional do-not-move)
52 "Rotate the yanking point by N places, and then return that kill.
53 (let VARLIST
54 BODY...)
55
56This function takes two arguments, one of which is optional. It has a
57documentation string. It is _not_ interactive.
58
59The body of the function definition is a `let' expression, which itself
60has a body as well as a VARLIST.
61
62The `let' expression declares a variable that will be only usable
63within the bounds of this function. This variable is called
64`interprogram-paste' and is for copying to another program. It is not
65for copying within this instance of GNU Emacs. Most window systems
66provide a facility for interprogram pasting. Sadly, that facility
67usually provides only for the lasted element. Most windowing systems
68have not adopted a ring of many possibilities, even though Emacs has
69provided it for decades.
70
71The `if' expression has two parts, one if there exists
72`interprogram-paste' and one if not.
73
74Let us consider the `if not' or else-part of the `current-kill'
75function. (The then-part uses the the `kill-new' function, which we
76have already described. (*Note The `kill-new' function: kill-new
77function.)
78
79 (or kill-ring (error "Kill ring is empty"))
80 (let ((ARGth-kill-element
81 (nthcdr (mod (- n (length kill-ring-yank-pointer))
82 (length kill-ring))
83 kill-ring)))
84 (or do-not-move
85 (setq kill-ring-yank-pointer ARGth-kill-element))
86 (car ARGth-kill-element))
87
88The code first checks whether the kill ring has content; otherwise it
89signals an error.
90
91Note that the `or' expression is very similar to writing
92
93 (if (zerop (length kill-ring)) ; if-part
94 (error "Kill ring is empty")) ; then-part
95 ;; No else-part
96
97If there is not anything in the kill ring, its length must be zero and
98an error message sent to the user: `Kill ring is empty'. The
99`current-kill' function uses an `or' expression which is simpler. But
100an `if' expression reminds us what goes on.
101
102This `if' expression uses the function `zerop' which returns true if
103the value it is testing is zero. When `zerop' tests true, the
104then-part of the `if' is evaluated. The then-part is a list starting
105with the function `error', which is a function that is similar to the
106`message' function (*note The `message' Function: message.), in that it
107prints a one-line message in the echo area. However, in addition to
108printing a message, `error' also stops evaluation of the function
109within which it is embedded. This means that the rest of the function
110will not be evaluated if the length of the kill ring is zero.
111
112Then the `current-kill' function selects the element to return. The
113selection depends on the number of places that `current-kill' rotates
114and on where `kill-ring-yank-pointer' points.
115
116Next, either the optional `do-not-move' argument is true or the current
117value of `kill-ring-yank-pointer' is set to point to the list, the
118first element of which is returned even if the `do-not-move' argument
119is true.
120
121* Menu:
122
123* Digression concerning error::
124* Determining the Element ::
125
126
127File: eintr, Node: Digression concerning error, Next: Determining the Element, Prev: Understanding current-kill, Up: Understanding current-kill
128
129Digression about the word `error'
130.................................
131
132In my opinion, it is slightly misleading, at least to humans, to use
133the term `error' as the name of the `error' function. A better term
134would be `cancel'. Strictly speaking, of course, you cannot point to,
135much less rotate a pointer to a list that has no length, so from the
136point of view of the computer, the word `error' is correct. But a
137human expects to attempt this sort of thing, if only to find out
138whether the kill ring is full or empty. This is an act of exploration.
139
140From the human point of view, the act of exploration and discovery is
141not necessarily an error, and therefore should not be labelled as one,
142even in the bowels of a computer. As it is, the code in Emacs implies
143that a human who is acting virtuously, by exploring his or her
144environment, is making an error. This is bad. Even though the computer
145takes the same steps as it does when there is an `error', a term such as
146`cancel' would have a clearer connotation.
147
148
149File: eintr, Node: Determining the Element, Prev: Digression concerning error, Up: Understanding current-kill
150
151Determining the Element
152.......................
153
154Among other actions, the else-part of the `if' expression sets the
155value of `kill-ring-yank-pointer' to `ARGth-kill-element' when the kill
156ring has something in it and the value of `do-not-move' is `nil'.
157
158The code looks like this:
159
160 (nthcdr (mod (- n (length kill-ring-yank-pointer))
161 (length kill-ring))
162 kill-ring)))
163
164This needs some examination. Unless it is not supposed to move the
165pointer, the `current-kill' function changes where
166`kill-ring-yank-pointer' points. That is what the
167`(setq kill-ring-yank-pointer ARGth-kill-element))' expression does.
168Also, clearly, `ARGth-kill-element' is being set to be equal to some
169CDR of the kill ring, using the `nthcdr' function that is described in
170an earlier section. (*Note copy-region-as-kill::.) How does it do
171this?
172
173As we have seen before (*note nthcdr::), the `nthcdr' function works by
174repeatedly taking the CDR of a list--it takes the CDR of the CDR of the
175CDR ...
176
177The two following expressions produce the same result:
178
179 (setq kill-ring-yank-pointer (cdr kill-ring))
180
181 (setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
182
183However, the `nthcdr' expression is more complicated. It uses the
184`mod' function to determine which CDR to select.
185
186(You will remember to look at inner functions first; indeed, we will
187have to go inside the `mod'.)
188
189The `mod' function returns the value of its first argument modulo the
190second; that is to say, it returns the remainder after dividing the
191first argument by the second. The value returned has the same sign as
192the second argument.
193
194Thus,
195
196 (mod 12 4)
197 => 0 ;; because there is no remainder
198 (mod 13 4)
199 => 1
200
201In this case, the first argument is often smaller than the second.
202That is fine.
203
204 (mod 0 4)
205 => 0
206 (mod 1 4)
207 => 1
208
209We can guess what the `-' function does. It is like `+' but subtracts
210instead of adds; the `-' function subtracts its second argument from
211its first. Also, we already know what the `length' function does
212(*note length::). It returns the length of a list.
213
214And `n' is the name of the required argument to the `current-kill'
215function.
216
217So when the first argument to `nthcdr' is zero, the `nthcdr' expression
218returns the whole list, as you can see by evaluating the following:
219
220 ;; kill-ring-yank-pointer and kill-ring have a length of four
221 (nthcdr (mod (- 0 4) 4) ; (mod -4 4) => 0
222 '("fourth line of text"
223 "third line"
224 "second piece of text"
225 "first some text"))
226
227When the first argument to the `current-kill' function is one, the
228`nthcdr' expression returns the list without its first element.
229
230 (nthcdr (mod (- 1 4) 4)
231 '("fourth line of text"
232 "third line"
233 "second piece of text"
234 "first some text"))
235
236Incidentally, both `kill-ring' and `kill-ring-yank-pointer' are "global
237variables". That means that any expression in Emacs Lisp can access
238them. They are not like the local variables set by `let' or like the
239symbols in an argument list. Local variables can only be accessed
240within the `let' that defines them or the function that specifies them
241in an argument list (and within expressions called by them).
242
243
244File: eintr, Node: yank, Next: yank-pop, Prev: current-kill, Up: Kill Ring
245
246B.2 `yank'
247==========
248
249After learning about `current-kill', the code for the `yank' function
250is almost easy. It has only one tricky part, which is the computation
251of the argument to be passed to `rotate-yank-pointer'.
252
253The code looks like this:
254
255 (defun yank (&optional arg)
256 "Reinsert (\"paste\") the last stretch of killed text.
257 More precisely, reinsert the stretch of killed text most recently
258 killed OR yanked. Put point at end, and set mark at beginning.
259 With just \\[universal-argument] as argument, same but put point at
260 beginning (and mark at end). With argument N, reinsert the Nth most
261 recently killed stretch of killed text.
262
263 When this command inserts killed text into the buffer, it honors
264 `yank-excluded-properties' and `yank-handler' as described in the
265 doc string for `insert-for-yank-1', which see.
266
267 See also the command \\[yank-pop]."
268 (interactive "*P")
269 (setq yank-window-start (window-start))
270 ;; If we don't get all the way thru, make last-command indicate that
271 ;; for the following command.
272 (setq this-command t)
273 (push-mark (point))
274 (insert-for-yank (current-kill (cond
275 ((listp arg) 0)
276 ((eq arg '-) -2)
277 (t (1- arg)))))
278 (if (consp arg)
279 ;; This is like exchange-point-and-mark,
280 ;; but doesn't activate the mark.
281 ;; It is cleaner to avoid activation, even though the command
282 ;; loop would deactivate the mark because we inserted text.
283 (goto-char (prog1 (mark t)
284 (set-marker (mark-marker) (point) (current-buffer)))))
285 ;; If we do get all the way thru, make this-command indicate that.
286 (if (eq this-command t)
287 (setq this-command 'yank))
288 nil)
289
290The key expression is `insert-for-yank', which inserts the string
291returned by `current-kill', but removes some text properties from it.
292
293However, before getting to that expression, the function set the value
294of `yank-window-start' to the position returned by the `(window-start)'
295expression, the position at which the display currently starts. It
296also set `this-command' and pushed the mark.
297
298After it yanks the appropriate element, if the optional argument is a
299CONS rather than a number or nothing, put point at beginning of the
300yanked text and mark at its end. (The `prog1' function is like `progn'
301but returns the value of its first argument rather than the value of
302its last argument. Its first argument is forced to return the buffer's
303mark as an integer. You can see the documentation for these functions
304by placing point over them in this buffer and then typing `C-h f'
305(`describe-function') followed by a `RET'; the default is the function.)
306
307The last part of the function tells what to do when it succeeds.
308
309
310File: eintr, Node: yank-pop, Next: ring file, Prev: yank, Up: Kill Ring
311
312B.3 `yank-pop'
313==============
314
315After understanding `yank' and `current-kill', you know how to approach
316the `yank-pop' function Leaving out the documentation to save space, it
317looks like this:
318
319 (defun yank-pop (&optional arg)
320 "..."
321 (interactive "*p")
322 (if (not (eq last-command 'yank))
323 (error "Previous command was not a yank"))
324 (setq this-command 'yank)
325 (unless arg (setq arg 1))
326 (let ((inhibit-read-only t)
327 (before (< (point) (mark t))))
328 (if before
329 (funcall (or yank-undo-function 'delete-region) (point) (mark t))
330 (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
331 (setq yank-undo-function nil)
332 (set-marker (mark-marker) (point) (current-buffer))
333 (insert-for-yank (current-kill arg))
334 ;; Set the window start back where it was in the yank command,
335 ;; if possible.
336 (set-window-start (selected-window) yank-window-start t)
337 (if before
338 ;; This is like exchange-point-and-mark,
339 ;; but doesn't activate the mark.
340 ;; It is cleaner to avoid activation, even though the command
341 ;; loop would deactivate the mark because we inserted text.
342 (goto-char (prog1 (mark t)
343 (set-marker (mark-marker)
344 (point)
345 (current-buffer))))))
346 nil)
347
348The function is interactive with a small `p' so the prefix argument is
349processed and passed to the function. The command can only be used
350after a previous yank; otherwise an error message is sent. This check
351uses the variable `last-command' which is set by `yank' and is
352discussed elsewhere. (*Note copy-region-as-kill::.)
353
354The `let' clause sets the variable `before' to true or false depending
355whether point is before or after mark and then the region between point
356and mark is deleted. This is the region that was just inserted by the
357previous yank and it is this text that will be replaced.
358
359`funcall' calls its first argument as a function, passing remaining
360arguments to it. The first argument is whatever the `or' expression
361returns. The two remaining arguments are the positions of point and
362mark set by the preceding `yank' command.
363
364There is more, but that is the hardest part.
365
366
367File: eintr, Node: ring file, Prev: yank-pop, Up: Kill Ring
368
369B.4 The `ring.el' File
370======================
371
372Interestingly, GNU Emacs posses a file called `ring.el' that provides
373many of the features we just discussed. But functions such as
374`kill-ring-yank-pointer' do not use this library, possibly because they
375were written earlier.
376
377
378File: eintr, Node: Full Graph, Next: Free Software and Free Manuals, Prev: Kill Ring, Up: Top
379
380Appendix C A Graph with Labelled Axes
381*************************************
382
383Printed axes help you understand a graph. They convey scale. In an
384earlier chapter (*note Readying a Graph: Readying a Graph.), we wrote
385the code to print the body of a graph. Here we write the code for
386printing and labelling vertical and horizontal axes, along with the
387body itself.
388
389* Menu:
390
391* Labelled Example::
392* print-graph Varlist::
393* print-Y-axis::
394* print-X-axis::
395* Print Whole Graph::
396
397
398File: eintr, Node: Labelled Example, Next: print-graph Varlist, Prev: Full Graph, Up: Full Graph
399
400Labelled Example Graph
401======================
402
403Since insertions fill a buffer to the right and below point, the new
404graph printing function should first print the Y or vertical axis, then
405the body of the graph, and finally the X or horizontal axis. This
406sequence lays out for us the contents of the function:
407
408 1. Set up code.
409
410 2. Print Y axis.
411
412 3. Print body of graph.
413
414 4. Print X axis.
415
416Here is an example of how a finished graph should look:
417
418 10 -
419 *
420 * *
421 * **
422 * ***
423 5 - * *******
424 * *** *******
425 *************
426 ***************
427 1 - ****************
428 | | | |
429 1 5 10 15
430
431In this graph, both the vertical and the horizontal axes are labelled
432with numbers. However, in some graphs, the horizontal axis is time and
433would be better labelled with months, like this:
434
435 5 - *
436 * ** *
437 *******
438 ********** **
439 1 - **************
440 | ^ |
441 Jan June Jan
442
443Indeed, with a little thought, we can easily come up with a variety of
444vertical and horizontal labelling schemes. Our task could become
445complicated. But complications breed confusion. Rather than permit
446this, it is better choose a simple labelling scheme for our first
447effort, and to modify or replace it later.
448
449These considerations suggest the following outline for the
450`print-graph' function:
451
452 (defun print-graph (numbers-list)
453 "DOCUMENTATION..."
454 (let ((height ...
455 ...))
456 (print-Y-axis height ... )
457 (graph-body-print numbers-list)
458 (print-X-axis ... )))
459
460We can work on each part of the `print-graph' function definition in
461turn.
462
463
464File: eintr, Node: print-graph Varlist, Next: print-Y-axis, Prev: Labelled Example, Up: Full Graph
465
466C.1 The `print-graph' Varlist
467=============================
468
469In writing the `print-graph' function, the first task is to write the
470varlist in the `let' expression. (We will leave aside for the moment
471any thoughts about making the function interactive or about the
472contents of its documentation string.)
473
474The varlist should set several values. Clearly, the top of the label
475for the vertical axis must be at least the height of the graph, which
476means that we must obtain this information here. Note that the
477`print-graph-body' function also requires this information. There is
478no reason to calculate the height of the graph in two different places,
479so we should change `print-graph-body' from the way we defined it
480earlier to take advantage of the calculation.
481
482Similarly, both the function for printing the X axis labels and the
483`print-graph-body' function need to learn the value of the width of
484each symbol. We can perform the calculation here and change the
485definition for `print-graph-body' from the way we defined it in the
486previous chapter.
487
488The length of the label for the horizontal axis must be at least as long
489as the graph. However, this information is used only in the function
490that prints the horizontal axis, so it does not need to be calculated
491here.
492
493These thoughts lead us directly to the following form for the varlist
494in the `let' for `print-graph':
495
496 (let ((height (apply 'max numbers-list)) ; First version.
497 (symbol-width (length graph-blank)))
498
499As we shall see, this expression is not quite right.
500
501
502File: eintr, Node: print-Y-axis, Next: print-X-axis, Prev: print-graph Varlist, Up: Full Graph
503
504C.2 The `print-Y-axis' Function
505===============================
506
507The job of the `print-Y-axis' function is to print a label for the
508vertical axis that looks like this:
509
510 10 -
511
512
513
514
515 5 -
516
517
518
519 1 -
520
521The function should be passed the height of the graph, and then should
522construct and insert the appropriate numbers and marks.
523
524It is easy enough to see in the figure what the Y axis label should
525look like; but to say in words, and then to write a function definition
526to do the job is another matter. It is not quite true to say that we
527want a number and a tic every five lines: there are only three lines
528between the `1' and the `5' (lines 2, 3, and 4), but four lines between
529the `5' and the `10' (lines 6, 7, 8, and 9). It is better to say that
530we want a number and a tic mark on the base line (number 1) and then
531that we want a number and a tic on the fifth line from the bottom and
532on every line that is a multiple of five.
533
534* Menu:
535
536* Height of label::
537* Compute a Remainder::
538* Y Axis Element::
539* Y-axis-column::
540* print-Y-axis Penultimate::
541
542
543File: eintr, Node: Height of label, Next: Compute a Remainder, Prev: print-Y-axis, Up: print-Y-axis
544
545What height should the label be?
546--------------------------------
547
548The next issue is what height the label should be? Suppose the maximum
549height of tallest column of the graph is seven. Should the highest
550label on the Y axis be `5 -', and should the graph stick up above the
551label? Or should the highest label be `7 -', and mark the peak of the
552graph? Or should the highest label be `10 -', which is a multiple of
553five, and be higher than the topmost value of the graph?
554
555The latter form is preferred. Most graphs are drawn within rectangles
556whose sides are an integral number of steps long--5, 10, 15, and so on
557for a step distance of five. But as soon as we decide to use a step
558height for the vertical axis, we discover that the simple expression in
559the varlist for computing the height is wrong. The expression is
560`(apply 'max numbers-list)'. This returns the precise height, not the
561maximum height plus whatever is necessary to round up to the nearest
562multiple of five. A more complex expression is required.
563
564As usual in cases like this, a complex problem becomes simpler if it is
565divided into several smaller problems.
566
567First, consider the case when the highest value of the graph is an
568integral multiple of five--when it is 5, 10, 15, or some higher
569multiple of five. We can use this value as the Y axis height.
570
571A fairly simply way to determine whether a number is a multiple of five
572is to divide it by five and see if the division results in a remainder.
573If there is no remainder, the number is a multiple of five. Thus,
574seven divided by five has a remainder of two, and seven is not an
575integral multiple of five. Put in slightly different language, more
576reminiscent of the classroom, five goes into seven once, with a
577remainder of two. However, five goes into ten twice, with no
578remainder: ten is an integral multiple of five.
579
580
581File: eintr, Node: Compute a Remainder, Next: Y Axis Element, Prev: Height of label, Up: print-Y-axis
582
583C.2.1 Side Trip: Compute a Remainder
584------------------------------------
585
586In Lisp, the function for computing a remainder is `%'. The function
587returns the remainder of its first argument divided by its second
588argument. As it happens, `%' is a function in Emacs Lisp that you
589cannot discover using `apropos': you find nothing if you type `M-x
590apropos <RET> remainder <RET>'. The only way to learn of the existence
591of `%' is to read about it in a book such as this or in the Emacs Lisp
592sources.
593
594You can try the `%' function by evaluating the following two
595expressions:
596
597 (% 7 5)
598
599 (% 10 5)
600
601The first expression returns 2 and the second expression returns 0.
602
603To test whether the returned value is zero or some other number, we can
604use the `zerop' function. This function returns `t' if its argument,
605which must be a number, is zero.
606
607 (zerop (% 7 5))
608 => nil
609
610 (zerop (% 10 5))
611 => t
612
613Thus, the following expression will return `t' if the height of the
614graph is evenly divisible by five:
615
616 (zerop (% height 5))
617
618(The value of `height', of course, can be found from `(apply 'max
619numbers-list)'.)
620
621On the other hand, if the value of `height' is not a multiple of five,
622we want to reset the value to the next higher multiple of five. This
623is straightforward arithmetic using functions with which we are already
624familiar. First, we divide the value of `height' by five to determine
625how many times five goes into the number. Thus, five goes into twelve
626twice. If we add one to this quotient and multiply by five, we will
627obtain the value of the next multiple of five that is larger than the
628height. Five goes into twelve twice. Add one to two, and multiply by
629five; the result is fifteen, which is the next multiple of five that is
630higher than twelve. The Lisp expression for this is:
631
632 (* (1+ (/ height 5)) 5)
633
634For example, if you evaluate the following, the result is 15:
635
636 (* (1+ (/ 12 5)) 5)
637
638All through this discussion, we have been using `five' as the value for
639spacing labels on the Y axis; but we may want to use some other value.
640For generality, we should replace `five' with a variable to which we
641can assign a value. The best name I can think of for this variable is
642`Y-axis-label-spacing'.
643
644Using this term, and an `if' expression, we produce the following:
645
646 (if (zerop (% height Y-axis-label-spacing))
647 height
648 ;; else
649 (* (1+ (/ height Y-axis-label-spacing))
650 Y-axis-label-spacing))
651
652This expression returns the value of `height' itself if the height is
653an even multiple of the value of the `Y-axis-label-spacing' or else it
654computes and returns a value of `height' that is equal to the next
655higher multiple of the value of the `Y-axis-label-spacing'.
656
657We can now include this expression in the `let' expression of the
658`print-graph' function (after first setting the value of
659`Y-axis-label-spacing'):
660
661 (defvar Y-axis-label-spacing 5
662 "Number of lines from one Y axis label to next.")
663
664 ...
665 (let* ((height (apply 'max numbers-list))
666 (height-of-top-line
667 (if (zerop (% height Y-axis-label-spacing))
668 height
669 ;; else
670 (* (1+ (/ height Y-axis-label-spacing))
671 Y-axis-label-spacing)))
672 (symbol-width (length graph-blank))))
673 ...
674
675(Note use of the `let*' function: the initial value of height is
676computed once by the `(apply 'max numbers-list)' expression and then
677the resulting value of `height' is used to compute its final value.
678*Note The `let*' expression: fwd-para let, for more about `let*'.)
679
680
681File: eintr, Node: Y Axis Element, Next: Y-axis-column, Prev: Compute a Remainder, Up: print-Y-axis
682
683C.2.2 Construct a Y Axis Element
684--------------------------------
685
686When we print the vertical axis, we want to insert strings such as
687`5 -' and `10 - ' every five lines. Moreover, we want the numbers and
688dashes to line up, so shorter numbers must be padded with leading
689spaces. If some of the strings use two digit numbers, the strings with
690single digit numbers must include a leading blank space before the
691number.
692
693To figure out the length of the number, the `length' function is used.
694But the `length' function works only with a string, not with a number.
695So the number has to be converted from being a number to being a
696string. This is done with the `number-to-string' function. For
697example,
698
699 (length (number-to-string 35))
700 => 2
701
702 (length (number-to-string 100))
703 => 3
704
705(`number-to-string' is also called `int-to-string'; you will see this
706alternative name in various sources.)
707
708In addition, in each label, each number is followed by a string such as
709` - ', which we will call the `Y-axis-tic' marker. This variable is
710defined with `defvar':
711
712 (defvar Y-axis-tic " - "
713 "String that follows number in a Y axis label.")
714
715The length of the Y label is the sum of the length of the Y axis tic
716mark and the length of the number of the top of the graph.
717
718 (length (concat (number-to-string height) Y-axis-tic)))
719
720This value will be calculated by the `print-graph' function in its
721varlist as `full-Y-label-width' and passed on. (Note that we did not
722think to include this in the varlist when we first proposed it.)
723
724To make a complete vertical axis label, a tic mark is concatenated with
725a number; and the two together may be preceded by one or more spaces
726depending on how long the number is. The label consists of three
727parts: the (optional) leading spaces, the number, and the tic mark.
728The function is passed the value of the number for the specific row,
729and the value of the width of the top line, which is calculated (just
730once) by `print-graph'.
731
732 (defun Y-axis-element (number full-Y-label-width)
733 "Construct a NUMBERed label element.
734 A numbered element looks like this ` 5 - ',
735 and is padded as needed so all line up with
736 the element for the largest number."
737 (let* ((leading-spaces
738 (- full-Y-label-width
739 (length
740 (concat (number-to-string number)
741 Y-axis-tic)))))
742 (concat
743 (make-string leading-spaces ? )
744 (number-to-string number)
745 Y-axis-tic)))
746
747The `Y-axis-element' function concatenates together the leading spaces,
748if any; the number, as a string; and the tic mark.
749
750To figure out how many leading spaces the label will need, the function
751subtracts the actual length of the label--the length of the number plus
752the length of the tic mark--from the desired label width.
753
754Blank spaces are inserted using the `make-string' function. This
755function takes two arguments: the first tells it how long the string
756will be and the second is a symbol for the character to insert, in a
757special format. The format is a question mark followed by a blank
758space, like this, `? '. *Note Character Type: (elisp)Character Type,
759for a description of the syntax for characters.
760
761The `number-to-string' function is used in the concatenation
762expression, to convert the number to a string that is concatenated with
763the leading spaces and the tic mark.
764
765
766File: eintr, Node: Y-axis-column, Next: print-Y-axis Penultimate, Prev: Y Axis Element, Up: print-Y-axis
767
768C.2.3 Create a Y Axis Column
769----------------------------
770
771The preceding functions provide all the tools needed to construct a
772function that generates a list of numbered and blank strings to insert
773as the label for the vertical axis:
774
775 (defun Y-axis-column (height width-of-label)
776 "Construct list of Y axis labels and blank strings.
777 For HEIGHT of line above base and WIDTH-OF-LABEL."
778 (let (Y-axis)
779 (while (> height 1)
780 (if (zerop (% height Y-axis-label-spacing))
781 ;; Insert label.
782 (setq Y-axis
783 (cons
784 (Y-axis-element height width-of-label)
785 Y-axis))
786 ;; Else, insert blanks.
787 (setq Y-axis
788 (cons
789 (make-string width-of-label ? )
790 Y-axis)))
791 (setq height (1- height)))
792 ;; Insert base line.
793 (setq Y-axis
794 (cons (Y-axis-element 1 width-of-label) Y-axis))
795 (nreverse Y-axis)))
796
797In this function, we start with the value of `height' and repetitively
798subtract one from its value. After each subtraction, we test to see
799whether the value is an integral multiple of the
800`Y-axis-label-spacing'. If it is, we construct a numbered label using
801the `Y-axis-element' function; if not, we construct a blank label using
802the `make-string' function. The base line consists of the number one
803followed by a tic mark.
804
805
806File: eintr, Node: print-Y-axis Penultimate, Prev: Y-axis-column, Up: print-Y-axis
807
808C.2.4 The Not Quite Final Version of `print-Y-axis'
809---------------------------------------------------
810
811The list constructed by the `Y-axis-column' function is passed to the
812`print-Y-axis' function, which inserts the list as a column.
813
814 (defun print-Y-axis (height full-Y-label-width)
815 "Insert Y axis using HEIGHT and FULL-Y-LABEL-WIDTH.
816 Height must be the maximum height of the graph.
817 Full width is the width of the highest label element."
818 ;; Value of height and full-Y-label-width
819 ;; are passed by `print-graph'.
820 (let ((start (point)))
821 (insert-rectangle
822 (Y-axis-column height full-Y-label-width))
823 ;; Place point ready for inserting graph.
824 (goto-char start)
825 ;; Move point forward by value of full-Y-label-width
826 (forward-char full-Y-label-width)))
827
828The `print-Y-axis' uses the `insert-rectangle' function to insert the Y
829axis labels created by the `Y-axis-column' function. In addition, it
830places point at the correct position for printing the body of the graph.
831
832You can test `print-Y-axis':
833
834 1. Install
835
836 Y-axis-label-spacing
837 Y-axis-tic
838 Y-axis-element
839 Y-axis-column
840 print-Y-axis
841
842 2. Copy the following expression:
843
844 (print-Y-axis 12 5)
845
846 3. Switch to the `*scratch*' buffer and place the cursor where you
847 want the axis labels to start.
848
849 4. Type `M-:' (`eval-expression').
850
851 5. Yank the `graph-body-print' expression into the minibuffer with
852 `C-y' (`yank)'.
853
854 6. Press <RET> to evaluate the expression.
855
856Emacs will print labels vertically, the top one being `10 - '. (The
857`print-graph' function will pass the value of `height-of-top-line',
858which in this case would end up as 15.)
859
860
861File: eintr, Node: print-X-axis, Next: Print Whole Graph, Prev: print-Y-axis, Up: Full Graph
862
863C.3 The `print-X-axis' Function
864===============================
865
866X axis labels are much like Y axis labels, except that the ticks are on
867a line above the numbers. Labels should look like this:
868
869 | | | |
870 1 5 10 15
871
872The first tic is under the first column of the graph and is preceded by
873several blank spaces. These spaces provide room in rows above for the Y
874axis labels. The second, third, fourth, and subsequent ticks are all
875spaced equally, according to the value of `X-axis-label-spacing'.
876
877The second row of the X axis consists of numbers, preceded by several
878blank spaces and also separated according to the value of the variable
879`X-axis-label-spacing'.
880
881The value of the variable `X-axis-label-spacing' should itself be
882measured in units of `symbol-width', since you may want to change the
883width of the symbols that you are using to print the body of the graph
884without changing the ways the graph is labelled.
885
886* Menu:
887
888* Similarities differences::
889* X Axis Tic Marks::
890
891
892File: eintr, Node: Similarities differences, Next: X Axis Tic Marks, Prev: print-X-axis, Up: print-X-axis
893
894Similarities and differences
895----------------------------
896
897The `print-X-axis' function is constructed in more or less the same
898fashion as the `print-Y-axis' function except that it has two lines:
899the line of tic marks and the numbers. We will write a separate
900function to print each line and then combine them within the
901`print-X-axis' function.
902
903This is a three step process:
904
905 1. Write a function to print the X axis tic marks,
906 `print-X-axis-tic-line'.
907
908 2. Write a function to print the X numbers,
909 `print-X-axis-numbered-line'.
910
911 3. Write a function to print both lines, the `print-X-axis' function,
912 using `print-X-axis-tic-line' and `print-X-axis-numbered-line'.
913
914
915File: eintr, Node: X Axis Tic Marks, Prev: Similarities differences, Up: print-X-axis
916
917C.3.1 X Axis Tic Marks
918----------------------
919
920The first function should print the X axis tic marks. We must specify
921the tic marks themselves and their spacing:
922
923 (defvar X-axis-label-spacing
924 (if (boundp 'graph-blank)
925 (* 5 (length graph-blank)) 5)
926 "Number of units from one X axis label to next.")
927
928(Note that the value of `graph-blank' is set by another `defvar'. The
929`boundp' predicate checks whether it has already been set; `boundp'
930returns `nil' if it has not. If `graph-blank' were unbound and we did
931not use this conditional construction, in GNU Emacs 21, we would enter
932the debugger and see an error message saying
933`Debugger entered--Lisp error: (void-variable graph-blank)'.)
934
935Here is the `defvar' for `X-axis-tic-symbol':
936
937 (defvar X-axis-tic-symbol "|"
938 "String to insert to point to a column in X axis.")
939
940The goal is to make a line that looks like this:
941
942 | | | |
943
944The first tic is indented so that it is under the first column, which is
945indented to provide space for the Y axis labels.
946
947A tic element consists of the blank spaces that stretch from one tic to
948the next plus a tic symbol. The number of blanks is determined by the
949width of the tic symbol and the `X-axis-label-spacing'.
950
951The code looks like this:
952
953 ;;; X-axis-tic-element
954 ...
955 (concat
956 (make-string
957 ;; Make a string of blanks.
958 (- (* symbol-width X-axis-label-spacing)
959 (length X-axis-tic-symbol))
960 ? )
961 ;; Concatenate blanks with tic symbol.
962 X-axis-tic-symbol)
963 ...
964
965Next, we determine how many blanks are needed to indent the first tic
966mark to the first column of the graph. This uses the value of
967`full-Y-label-width' passed it by the `print-graph' function.
968
969The code to make `X-axis-leading-spaces' looks like this:
970
971 ;; X-axis-leading-spaces
972 ...
973 (make-string full-Y-label-width ? )
974 ...
975
976We also need to determine the length of the horizontal axis, which is
977the length of the numbers list, and the number of ticks in the
978horizontal axis:
979
980 ;; X-length
981 ...
982 (length numbers-list)
983
984 ;; tic-width
985 ...
986 (* symbol-width X-axis-label-spacing)
987
988 ;; number-of-X-ticks
989 (if (zerop (% (X-length tic-width)))
990 (/ (X-length tic-width))
991 (1+ (/ (X-length tic-width))))
992
993All this leads us directly to the function for printing the X axis tic
994line:
995
996 (defun print-X-axis-tic-line
997 (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
998 "Print ticks for X axis."
999 (insert X-axis-leading-spaces)
1000 (insert X-axis-tic-symbol) ; Under first column.
1001 ;; Insert second tic in the right spot.
1002 (insert (concat
1003 (make-string
1004 (- (* symbol-width X-axis-label-spacing)
1005 ;; Insert white space up to second tic symbol.
1006 (* 2 (length X-axis-tic-symbol)))
1007 ? )
1008 X-axis-tic-symbol))
1009 ;; Insert remaining ticks.
1010 (while (> number-of-X-tics 1)
1011 (insert X-axis-tic-element)
1012 (setq number-of-X-tics (1- number-of-X-tics))))
1013
1014The line of numbers is equally straightforward:
1015
1016First, we create a numbered element with blank spaces before each
1017number:
1018
1019 (defun X-axis-element (number)
1020 "Construct a numbered X axis element."
1021 (let ((leading-spaces
1022 (- (* symbol-width X-axis-label-spacing)
1023 (length (number-to-string number)))))
1024 (concat (make-string leading-spaces ? )
1025 (number-to-string number))))
1026
1027Next, we create the function to print the numbered line, starting with
1028the number "1" under the first column:
1029
1030 (defun print-X-axis-numbered-line
1031 (number-of-X-tics X-axis-leading-spaces)
1032 "Print line of X-axis numbers"
1033 (let ((number X-axis-label-spacing))
1034 (insert X-axis-leading-spaces)
1035 (insert "1")
1036 (insert (concat
1037 (make-string
1038 ;; Insert white space up to next number.
1039 (- (* symbol-width X-axis-label-spacing) 2)
1040 ? )
1041 (number-to-string number)))
1042 ;; Insert remaining numbers.
1043 (setq number (+ number X-axis-label-spacing))
1044 (while (> number-of-X-tics 1)
1045 (insert (X-axis-element number))
1046 (setq number (+ number X-axis-label-spacing))
1047 (setq number-of-X-tics (1- number-of-X-tics)))))
1048
1049Finally, we need to write the `print-X-axis' that uses
1050`print-X-axis-tic-line' and `print-X-axis-numbered-line'.
1051
1052The function must determine the local values of the variables used by
1053both `print-X-axis-tic-line' and `print-X-axis-numbered-line', and then
1054it must call them. Also, it must print the carriage return that
1055separates the two lines.
1056
1057The function consists of a varlist that specifies five local variables,
1058and calls to each of the two line printing functions:
1059
1060 (defun print-X-axis (numbers-list)
1061 "Print X axis labels to length of NUMBERS-LIST."
1062 (let* ((leading-spaces
1063 (make-string full-Y-label-width ? ))
1064 ;; symbol-width is provided by graph-body-print
1065 (tic-width (* symbol-width X-axis-label-spacing))
1066 (X-length (length numbers-list))
1067 (X-tic
1068 (concat
1069 (make-string
1070 ;; Make a string of blanks.
1071 (- (* symbol-width X-axis-label-spacing)
1072 (length X-axis-tic-symbol))
1073 ? )
1074 ;; Concatenate blanks with tic symbol.
1075 X-axis-tic-symbol))
1076 (tic-number
1077 (if (zerop (% X-length tic-width))
1078 (/ X-length tic-width)
1079 (1+ (/ X-length tic-width)))))
1080 (print-X-axis-tic-line tic-number leading-spaces X-tic)
1081 (insert "\n")
1082 (print-X-axis-numbered-line tic-number leading-spaces)))
1083
1084You can test `print-X-axis':
1085
1086 1. Install `X-axis-tic-symbol', `X-axis-label-spacing',
1087 `print-X-axis-tic-line', as well as `X-axis-element',
1088 `print-X-axis-numbered-line', and `print-X-axis'.
1089
1090 2. Copy the following expression:
1091
1092 (progn
1093 (let ((full-Y-label-width 5)
1094 (symbol-width 1))
1095 (print-X-axis
1096 '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))))
1097
1098 3. Switch to the `*scratch*' buffer and place the cursor where you
1099 want the axis labels to start.
1100
1101 4. Type `M-:' (`eval-expression').
1102
1103 5. Yank the test expression into the minibuffer with `C-y' (`yank)'.
1104
1105 6. Press <RET> to evaluate the expression.
1106
1107Emacs will print the horizontal axis like this:
1108
1109 | | | | |
1110 1 5 10 15 20
1111
1112
1113File: eintr, Node: Print Whole Graph, Prev: print-X-axis, Up: Full Graph
1114
1115C.4 Printing the Whole Graph
1116============================
1117
1118Now we are nearly ready to print the whole graph.
1119
1120The function to print the graph with the proper labels follows the
1121outline we created earlier (*note A Graph with Labelled Axes: Full
1122Graph.), but with additions.
1123
1124Here is the outline:
1125
1126 (defun print-graph (numbers-list)
1127 "DOCUMENTATION..."
1128 (let ((height ...
1129 ...))
1130 (print-Y-axis height ... )
1131 (graph-body-print numbers-list)
1132 (print-X-axis ... )))
1133
1134* Menu:
1135
1136* The final version::
1137* Test print-graph::
1138* Graphing words in defuns::
1139* lambda::
1140* mapcar::
1141* Another Bug::
1142* Final printed graph::
1143
1144
1145File: eintr, Node: The final version, Next: Test print-graph, Prev: Print Whole Graph, Up: Print Whole Graph
1146
1147Changes for the Final Version
1148-----------------------------
1149
1150The final version is different from what we planned in two ways: first,
1151it contains additional values calculated once in the varlist; second,
1152it carries an option to specify the labels' increment per row. This
1153latter feature turns out to be essential; otherwise, a graph may have
1154more rows than fit on a display or on a sheet of paper.
1155
1156This new feature requires a change to the `Y-axis-column' function, to
1157add `vertical-step' to it. The function looks like this:
1158
1159 ;;; Final version.
1160 (defun Y-axis-column
1161 (height width-of-label &optional vertical-step)
1162 "Construct list of labels for Y axis.
1163 HEIGHT is maximum height of graph.
1164 WIDTH-OF-LABEL is maximum width of label.
1165 VERTICAL-STEP, an option, is a positive integer
1166 that specifies how much a Y axis label increments
1167 for each line. For example, a step of 5 means
1168 that each line is five units of the graph."
1169 (let (Y-axis
1170 (number-per-line (or vertical-step 1)))
1171 (while (> height 1)
1172 (if (zerop (% height Y-axis-label-spacing))
1173 ;; Insert label.
1174 (setq Y-axis
1175 (cons
1176 (Y-axis-element
1177 (* height number-per-line)
1178 width-of-label)
1179 Y-axis))
1180 ;; Else, insert blanks.
1181 (setq Y-axis
1182 (cons
1183 (make-string width-of-label ? )
1184 Y-axis)))
1185 (setq height (1- height)))
1186 ;; Insert base line.
1187 (setq Y-axis (cons (Y-axis-element
1188 (or vertical-step 1)
1189 width-of-label)
1190 Y-axis))
1191 (nreverse Y-axis)))
1192
1193The values for the maximum height of graph and the width of a symbol
1194are computed by `print-graph' in its `let' expression; so
1195`graph-body-print' must be changed to accept them.
1196
1197 ;;; Final version.
1198 (defun graph-body-print (numbers-list height symbol-width)
1199 "Print a bar graph of the NUMBERS-LIST.
1200 The numbers-list consists of the Y-axis values.
1201 HEIGHT is maximum height of graph.
1202 SYMBOL-WIDTH is number of each column."
1203 (let (from-position)
1204 (while numbers-list
1205 (setq from-position (point))
1206 (insert-rectangle
1207 (column-of-graph height (car numbers-list)))
1208 (goto-char from-position)
1209 (forward-char symbol-width)
1210 ;; Draw graph column by column.
1211 (sit-for 0)
1212 (setq numbers-list (cdr numbers-list)))
1213 ;; Place point for X axis labels.
1214 (forward-line height)
1215 (insert "\n")))
1216
1217Finally, the code for the `print-graph' function:
1218
1219 ;;; Final version.
1220 (defun print-graph
1221 (numbers-list &optional vertical-step)
1222 "Print labelled bar graph of the NUMBERS-LIST.
1223 The numbers-list consists of the Y-axis values.
1224
1225 Optionally, VERTICAL-STEP, a positive integer,
1226 specifies how much a Y axis label increments for
1227 each line. For example, a step of 5 means that
1228 each row is five units."
1229 (let* ((symbol-width (length graph-blank))
1230 ;; `height' is both the largest number
1231 ;; and the number with the most digits.
1232 (height (apply 'max numbers-list))
1233 (height-of-top-line
1234 (if (zerop (% height Y-axis-label-spacing))
1235 height
1236 ;; else
1237 (* (1+ (/ height Y-axis-label-spacing))
1238 Y-axis-label-spacing)))
1239 (vertical-step (or vertical-step 1))
1240 (full-Y-label-width
1241 (length
1242 (concat
1243 (number-to-string
1244 (* height-of-top-line vertical-step))
1245 Y-axis-tic))))
1246
1247 (print-Y-axis
1248 height-of-top-line full-Y-label-width vertical-step)
1249 (graph-body-print
1250 numbers-list height-of-top-line symbol-width)
1251 (print-X-axis numbers-list)))
1252
1253
1254File: eintr, Node: Test print-graph, Next: Graphing words in defuns, Prev: The final version, Up: Print Whole Graph
1255
1256C.4.1 Testing `print-graph'
1257---------------------------
1258
1259We can test the `print-graph' function with a short list of numbers:
1260
1261 1. Install the final versions of `Y-axis-column', `graph-body-print',
1262 and `print-graph' (in addition to the rest of the code.)
1263
1264 2. Copy the following expression:
1265
1266 (print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1))
1267
1268 3. Switch to the `*scratch*' buffer and place the cursor where you
1269 want the axis labels to start.
1270
1271 4. Type `M-:' (`eval-expression').
1272
1273 5. Yank the test expression into the minibuffer with `C-y' (`yank)'.
1274
1275 6. Press <RET> to evaluate the expression.
1276
1277Emacs will print a graph that looks like this:
1278
1279 10 -
1280
1281
1282 *
1283 ** *
1284 5 - **** *
1285 **** ***
1286 * *********
1287 ************
1288 1 - *************
1289
1290 | | | |
1291 1 5 10 15
1292
1293On the other hand, if you pass `print-graph' a `vertical-step' value of
12942, by evaluating this expression:
1295
1296 (print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1) 2)
1297
1298The graph looks like this:
1299
1300 20 -
1301
1302
1303 *
1304 ** *
1305 10 - **** *
1306 **** ***
1307 * *********
1308 ************
1309 2 - *************
1310
1311 | | | |
1312 1 5 10 15
1313
1314(A question: is the `2' on the bottom of the vertical axis a bug or a
1315feature? If you think it is a bug, and should be a `1' instead, (or
1316even a `0'), you can modify the sources.)
1317
1318
1319File: eintr, Node: Graphing words in defuns, Next: lambda, Prev: Test print-graph, Up: Print Whole Graph
1320
1321C.4.2 Graphing Numbers of Words and Symbols
1322-------------------------------------------
1323
1324Now for the graph for which all this code was written: a graph that
1325shows how many function definitions contain fewer than 10 words and
1326symbols, how many contain between 10 and 19 words and symbols, how many
1327contain between 20 and 29 words and symbols, and so on.
1328
1329This is a multi-step process. First make sure you have loaded all the
1330requisite code.
1331
1332It is a good idea to reset the value of `top-of-ranges' in case you
1333have set it to some different value. You can evaluate the following:
1334
1335 (setq top-of-ranges
1336 '(10 20 30 40 50
1337 60 70 80 90 100
1338 110 120 130 140 150
1339 160 170 180 190 200
1340 210 220 230 240 250
1341 260 270 280 290 300)
1342
1343Next create a list of the number of words and symbols in each range.
1344
1345Evaluate the following:
1346
1347 (setq list-for-graph
1348 (defuns-per-range
1349 (sort
1350 (recursive-lengths-list-many-files
1351 (directory-files "/usr/local/emacs/lisp"
1352 t ".+el$"))
1353 '<)
1354 top-of-ranges))
1355
1356On my old machine, this took about an hour. It looked though 303 Lisp
1357files in my copy of Emacs version 19.23. After all that computing, the
1358`list-for-graph' had this value:
1359
1360 (537 1027 955 785 594 483 349 292 224 199 166 120 116 99
1361 90 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
1362
1363This means that my copy of Emacs had 537 function definitions with
1364fewer than 10 words or symbols in them, 1,027 function definitions with
136510 to 19 words or symbols in them, 955 function definitions with 20 to
136629 words or symbols in them, and so on.
1367
1368Clearly, just by looking at this list we can see that most function
1369definitions contain ten to thirty words and symbols.
1370
1371Now for printing. We do _not_ want to print a graph that is 1,030
1372lines high ... Instead, we should print a graph that is fewer than
1373twenty-five lines high. A graph that height can be displayed on almost
1374any monitor, and easily printed on a sheet of paper.
1375
1376This means that each value in `list-for-graph' must be reduced to
1377one-fiftieth its present value.
1378
1379Here is a short function to do just that, using two functions we have
1380not yet seen, `mapcar' and `lambda'.
1381
1382 (defun one-fiftieth (full-range)
1383 "Return list, each number one-fiftieth of previous."
1384 (mapcar '(lambda (arg) (/ arg 50)) full-range))
1385
1386
1387File: eintr, Node: lambda, Next: mapcar, Prev: Graphing words in defuns, Up: Print Whole Graph
1388
1389C.4.3 A `lambda' Expression: Useful Anonymity
1390---------------------------------------------
1391
1392`lambda' is the symbol for an anonymous function, a function without a
1393name. Every time you use an anonymous function, you need to include
1394its whole body.
1395
1396Thus,
1397
1398 (lambda (arg) (/ arg 50))
1399
1400is a function definition that says `return the value resulting from
1401dividing whatever is passed to me as `arg' by 50'.
1402
1403Earlier, for example, we had a function `multiply-by-seven'; it
1404multiplied its argument by 7. This function is similar, except it
1405divides its argument by 50; and, it has no name. The anonymous
1406equivalent of `multiply-by-seven' is:
1407
1408 (lambda (number) (* 7 number))
1409
1410(*Note The `defun' Special Form: defun.)
1411
1412If we want to multiply 3 by 7, we can write:
1413
1414 (multiply-by-seven 3)
1415 \_______________/ ^
1416 | |
1417 function argument
1418
1419
1420
1421This expression returns 21.
1422
1423Similarly, we can write:
1424
1425 ((lambda (number) (* 7 number)) 3)
1426 \____________________________/ ^
1427 | |
1428 anonymous function argument
1429
1430
1431
1432If we want to divide 100 by 50, we can write:
1433
1434 ((lambda (arg) (/ arg 50)) 100)
1435 \______________________/ \_/
1436 | |
1437 anonymous function argument
1438
1439
1440
1441This expression returns 2. The 100 is passed to the function, which
1442divides that number by 50.
1443
1444*Note Lambda Expressions: (elisp)Lambda Expressions, for more about
1445`lambda'. Lisp and lambda expressions derive from the Lambda Calculus.
1446
1447
1448File: eintr, Node: mapcar, Next: Another Bug, Prev: lambda, Up: Print Whole Graph
1449
1450C.4.4 The `mapcar' Function
1451---------------------------
1452
1453`mapcar' is a function that calls its first argument with each element
1454of its second argument, in turn. The second argument must be a
1455sequence.
1456
1457The `map' part of the name comes from the mathematical phrase, `mapping
1458over a domain', meaning to apply a function to each of the elements in
1459a domain. The mathematical phrase is based on the metaphor of a
1460surveyor walking, one step at a time, over an area he is mapping. And
1461`car', of course, comes from the Lisp notion of the first of a list.
1462
1463For example,
1464
1465 (mapcar '1+ '(2 4 6))
1466 => (3 5 7)
1467
1468The function `1+' which adds one to its argument, is executed on _each_
1469element of the list, and a new list is returned.
1470
1471Contrast this with `apply', which applies its first argument to all the
1472remaining. (*Note Readying a Graph: Readying a Graph, for a
1473explanation of `apply'.)
1474
1475In the definition of `one-fiftieth', the first argument is the
1476anonymous function:
1477
1478 (lambda (arg) (/ arg 50))
1479
1480and the second argument is `full-range', which will be bound to
1481`list-for-graph'.
1482
1483The whole expression looks like this:
1484
1485 (mapcar '(lambda (arg) (/ arg 50)) full-range))
1486
1487*Note Mapping Functions: (elisp)Mapping Functions, for more about
1488`mapcar'.
1489
1490Using the `one-fiftieth' function, we can generate a list in which each
1491element is one-fiftieth the size of the corresponding element in
1492`list-for-graph'.
1493
1494 (setq fiftieth-list-for-graph
1495 (one-fiftieth list-for-graph))
1496
1497The resulting list looks like this:
1498
1499 (10 20 19 15 11 9 6 5 4 3 3 2 2
1500 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)
1501
1502This, we are almost ready to print! (We also notice the loss of
1503information: many of the higher ranges are 0, meaning that fewer than
150450 defuns had that many words or symbols--but not necessarily meaning
1505that none had that many words or symbols.)
1506
1507
1508File: eintr, Node: Another Bug, Next: Final printed graph, Prev: mapcar, Up: Print Whole Graph
1509
1510C.4.5 Another Bug ... Most Insidious
1511------------------------------------
1512
1513I said `almost ready to print'! Of course, there is a bug in the
1514`print-graph' function ... It has a `vertical-step' option, but not a
1515`horizontal-step' option. The `top-of-range' scale goes from 10 to 300
1516by tens. But the `print-graph' function will print only by ones.
1517
1518This is a classic example of what some consider the most insidious type
1519of bug, the bug of omission. This is not the kind of bug you can find
1520by studying the code, for it is not in the code; it is an omitted
1521feature. Your best actions are to try your program early and often;
1522and try to arrange, as much as you can, to write code that is easy to
1523understand and easy to change. Try to be aware, whenever you can, that
1524whatever you have written, _will_ be rewritten, if not soon,
1525eventually. A hard maxim to follow.
1526
1527It is the `print-X-axis-numbered-line' function that needs the work;
1528and then the `print-X-axis' and the `print-graph' functions need to be
1529adapted. Not much needs to be done; there is one nicety: the numbers
1530ought to line up under the tic marks. This takes a little thought.
1531
1532Here is the corrected `print-X-axis-numbered-line':
1533
1534 (defun print-X-axis-numbered-line
1535 (number-of-X-tics X-axis-leading-spaces
1536 &optional horizontal-step)
1537 "Print line of X-axis numbers"
1538 (let ((number X-axis-label-spacing)
1539 (horizontal-step (or horizontal-step 1)))
1540 (insert X-axis-leading-spaces)
1541 ;; Delete extra leading spaces.
1542 (delete-char
1543 (- (1-
1544 (length (number-to-string horizontal-step)))))
1545 (insert (concat
1546 (make-string
1547 ;; Insert white space.
1548 (- (* symbol-width
1549 X-axis-label-spacing)
1550 (1-
1551 (length
1552 (number-to-string horizontal-step)))
1553 2)
1554 ? )
1555 (number-to-string
1556 (* number horizontal-step))))
1557 ;; Insert remaining numbers.
1558 (setq number (+ number X-axis-label-spacing))
1559 (while (> number-of-X-tics 1)
1560 (insert (X-axis-element
1561 (* number horizontal-step)))
1562 (setq number (+ number X-axis-label-spacing))
1563 (setq number-of-X-tics (1- number-of-X-tics)))))
1564
1565If you are reading this in Info, you can see the new versions of
1566`print-X-axis' `print-graph' and evaluate them. If you are reading
1567this in a printed book, you can see the changed lines here (the full
1568text is too much to print).
1569
1570 (defun print-X-axis (numbers-list horizontal-step)
1571 "Print X axis labels to length of NUMBERS-LIST.
1572 Optionally, HORIZONTAL-STEP, a positive integer,
1573 specifies how much an X axis label increments for
1574 each column."
1575 ;; Value of symbol-width and full-Y-label-width
1576 ;; are passed by `print-graph'.
1577 (let* ((leading-spaces
1578 (make-string full-Y-label-width ? ))
1579 ;; symbol-width is provided by graph-body-print
1580 (tic-width (* symbol-width X-axis-label-spacing))
1581 (X-length (length numbers-list))
1582 (X-tic
1583 (concat
1584 (make-string
1585 ;; Make a string of blanks.
1586 (- (* symbol-width X-axis-label-spacing)
1587 (length X-axis-tic-symbol))
1588 ? )
1589 ;; Concatenate blanks with tic symbol.
1590 X-axis-tic-symbol))
1591 (tic-number
1592 (if (zerop (% X-length tic-width))
1593 (/ X-length tic-width)
1594 (1+ (/ X-length tic-width)))))
1595
1596 (print-X-axis-tic-line
1597 tic-number leading-spaces X-tic)
1598 (insert "\n")
1599 (print-X-axis-numbered-line
1600 tic-number leading-spaces horizontal-step)))
1601
1602 (defun print-graph
1603 (numbers-list &optional vertical-step horizontal-step)
1604 "Print labelled bar graph of the NUMBERS-LIST.
1605 The numbers-list consists of the Y-axis values.
1606
1607 Optionally, VERTICAL-STEP, a positive integer,
1608 specifies how much a Y axis label increments for
1609 each line. For example, a step of 5 means that
1610 each row is five units.
1611
1612 Optionally, HORIZONTAL-STEP, a positive integer,
1613 specifies how much an X axis label increments for
1614 each column."
1615 (let* ((symbol-width (length graph-blank))
1616 ;; `height' is both the largest number
1617 ;; and the number with the most digits.
1618 (height (apply 'max numbers-list))
1619 (height-of-top-line
1620 (if (zerop (% height Y-axis-label-spacing))
1621 height
1622 ;; else
1623 (* (1+ (/ height Y-axis-label-spacing))
1624 Y-axis-label-spacing)))
1625 (vertical-step (or vertical-step 1))
1626 (full-Y-label-width
1627 (length
1628 (concat
1629 (number-to-string
1630 (* height-of-top-line vertical-step))
1631 Y-axis-tic))))
1632 (print-Y-axis
1633 height-of-top-line full-Y-label-width vertical-step)
1634 (graph-body-print
1635 numbers-list height-of-top-line symbol-width)
1636 (print-X-axis numbers-list horizontal-step)))
1637
1638
1639File: eintr, Node: Final printed graph, Prev: Another Bug, Up: Print Whole Graph
1640
1641C.4.6 The Printed Graph
1642-----------------------
1643
1644When made and installed, you can call the `print-graph' command like
1645this:
1646
1647 (print-graph fiftieth-list-for-graph 50 10)
1648
1649
1650Here is the graph:
1651
1652
1653 1000 - *
1654 **
1655 **
1656 **
1657 **
1658 750 - ***
1659 ***
1660 ***
1661 ***
1662 ****
1663 500 - *****
1664 ******
1665 ******
1666 ******
1667 *******
1668 250 - ********
1669 ********* *
1670 *********** *
1671 ************* *
1672 50 - ***************** * *
1673 | | | | | | | |
1674 10 50 100 150 200 250 300 350
1675
1676
1677
1678The largest group of functions contain 10 - 19 words and symbols each.
1679
1680
1681File: eintr, Node: Free Software and Free Manuals, Next: GNU Free Documentation License, Prev: Full Graph, Up: Top
1682
1683Appendix D Free Software and Free Manuals
1684*****************************************
1685
1686*by Richard M. Stallman*
1687
1688The biggest deficiency in free operating systems is not in the
1689software--it is the lack of good free manuals that we can include in
1690these systems. Many of our most important programs do not come with
1691full manuals. Documentation is an essential part of any software
1692package; when an important free software package does not come with a
1693free manual, that is a major gap. We have many such gaps today.
1694
1695Once upon a time, many years ago, I thought I would learn Perl. I got
1696a copy of a free manual, but I found it hard to read. When I asked
1697Perl users about alternatives, they told me that there were better
1698introductory manuals--but those were not free.
1699
1700Why was this? The authors of the good manuals had written them for
1701O'Reilly Associates, which published them with restrictive terms--no
1702copying, no modification, source files not available--which exclude
1703them from the free software community.
1704
1705That wasn't the first time this sort of thing has happened, and (to our
1706community's great loss) it was far from the last. Proprietary manual
1707publishers have enticed a great many authors to restrict their manuals
1708since then. Many times I have heard a GNU user eagerly tell me about a
1709manual that he is writing, with which he expects to help the GNU
1710project--and then had my hopes dashed, as he proceeded to explain that
1711he had signed a contract with a publisher that would restrict it so
1712that we cannot use it.
1713
1714Given that writing good English is a rare skill among programmers, we
1715can ill afford to lose manuals this way.
1716
1717(The Free Software Foundation sells printed copies of free GNU manuals
1718(http://www.gnu.org/doc/doc.html), too.)
1719
1720Free documentation, like free software, is a matter of freedom, not
1721price. The problem with these manuals was not that O'Reilly Associates
1722charged a price for printed copies--that in itself is fine. (The Free
1723Software Foundation sells printed copies of free GNU manuals, too.)
1724But GNU manuals are available in source code form, while these manuals
1725are available only on paper. GNU manuals come with permission to copy
1726and modify; the Perl manuals do not. These restrictions are the
1727problems.
1728
1729The criterion for a free manual is pretty much the same as for free
1730software: it is a matter of giving all users certain freedoms.
1731Redistribution (including commercial redistribution) must be permitted,
1732so that the manual can accompany every copy of the program, on-line or
1733on paper. Permission for modification is crucial too.
1734
1735As a general rule, I don't believe that it is essential for people to
1736have permission to modify all sorts of articles and books. The issues
1737for writings are not necessarily the same as those for software. For
1738example, I don't think you or I are obliged to give permission to
1739modify articles like this one, which describe our actions and our views.
1740
1741But there is a particular reason why the freedom to modify is crucial
1742for documentation for free software. When people exercise their right
1743to modify the software, and add or change its features, if they are
1744conscientious they will change the manual too--so they can provide
1745accurate and usable documentation with the modified program. A manual
1746which forbids programmers to be conscientious and finish the job, or
1747more precisely requires them to write a new manual from scratch if they
1748change the program, does not fill our community's needs.
1749
1750While a blanket prohibition on modification is unacceptable, some kinds
1751of limits on the method of modification pose no problem. For example,
1752requirements to preserve the original author's copyright notice, the
1753distribution terms, or the list of authors, are ok. It is also no
1754problem to require modified versions to include notice that they were
1755modified, even to have entire sections that may not be deleted or
1756changed, as long as these sections deal with nontechnical topics.
1757(Some GNU manuals have them.)
1758
1759These kinds of restrictions are not a problem because, as a practical
1760matter, they don't stop the conscientious programmer from adapting the
1761manual to fit the modified program. In other words, they don't block
1762the free software community from making full use of the manual.
1763
1764However, it must be possible to modify all the technical content of the
1765manual, and then distribute the result in all the usual media, through
1766all the usual channels; otherwise, the restrictions do block the
1767community, the manual is not free, and so we need another manual.
1768
1769Unfortunately, it is often hard to find someone to write another manual
1770when a proprietary manual exists. The obstacle is that many users
1771think that a proprietary manual is good enough--so they don't see the
1772need to write a free manual. They do not see that the free operating
1773system has a gap that needs filling.
1774
1775Why do users think that proprietary manuals are good enough? Some have
1776not considered the issue. I hope this article will do something to
1777change that.
1778
1779Other users consider proprietary manuals acceptable for the same reason
1780so many people consider proprietary software acceptable: they judge in
1781purely practical terms, not using freedom as a criterion. These people
1782are entitled to their opinions, but since those opinions spring from
1783values which do not include freedom, they are no guide for those of us
1784who do value freedom.
1785
1786Please spread the word about this issue. We continue to lose manuals
1787to proprietary publishing. If we spread the word that proprietary
1788manuals are not sufficient, perhaps the next person who wants to help
1789GNU by writing documentation will realize, before it is too late, that
1790he must above all make it free.
1791
1792We can also encourage commercial publishers to sell free, copylefted
1793manuals instead of proprietary ones. One way you can help this is to
1794check the distribution terms of a manual before you buy it, and prefer
1795copylefted manuals to non-copylefted ones.
1796
1797
1798
1799Note: The Free Software Foundation maintains a page on its Web site
1800that lists free books available from other publishers:
1801`http://www.gnu.org/doc/other-free-books.html'
1802
1803
1804File: eintr, Node: GNU Free Documentation License, Next: Index, Prev: Free Software and Free Manuals, Up: Top
1805
1806Appendix E GNU Free Documentation License
1807*****************************************
1808
1809 Version 1.2, November 2002
1810
1811 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
1812 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
1813
1814 Everyone is permitted to copy and distribute verbatim copies
1815 of this license document, but changing it is not allowed.
1816
1817 0. PREAMBLE
1818
1819 The purpose of this License is to make a manual, textbook, or other
1820 functional and useful document "free" in the sense of freedom: to
1821 assure everyone the effective freedom to copy and redistribute it,
1822 with or without modifying it, either commercially or
1823 noncommercially. Secondarily, this License preserves for the
1824 author and publisher a way to get credit for their work, while not
1825 being considered responsible for modifications made by others.
1826
1827 This License is a kind of "copyleft", which means that derivative
1828 works of the document must themselves be free in the same sense.
1829 It complements the GNU General Public License, which is a copyleft
1830 license designed for free software.
1831
1832 We have designed this License in order to use it for manuals for
1833 free software, because free software needs free documentation: a
1834 free program should come with manuals providing the same freedoms
1835 that the software does. But this License is not limited to
1836 software manuals; it can be used for any textual work, regardless
1837 of subject matter or whether it is published as a printed book.
1838 We recommend this License principally for works whose purpose is
1839 instruction or reference.
1840
1841 1. APPLICABILITY AND DEFINITIONS
1842
1843 This License applies to any manual or other work, in any medium,
1844 that contains a notice placed by the copyright holder saying it
1845 can be distributed under the terms of this License. Such a notice
1846 grants a world-wide, royalty-free license, unlimited in duration,
1847 to use that work under the conditions stated herein. The
1848 "Document", below, refers to any such manual or work. Any member
1849 of the public is a licensee, and is addressed as "you". You
1850 accept the license if you copy, modify or distribute the work in a
1851 way requiring permission under copyright law.
1852
1853 A "Modified Version" of the Document means any work containing the
1854 Document or a portion of it, either copied verbatim, or with
1855 modifications and/or translated into another language.
1856
1857 A "Secondary Section" is a named appendix or a front-matter section
1858 of the Document that deals exclusively with the relationship of the
1859 publishers or authors of the Document to the Document's overall
1860 subject (or to related matters) and contains nothing that could
1861 fall directly within that overall subject. (Thus, if the Document
1862 is in part a textbook of mathematics, a Secondary Section may not
1863 explain any mathematics.) The relationship could be a matter of
1864 historical connection with the subject or with related matters, or
1865 of legal, commercial, philosophical, ethical or political position
1866 regarding them.
1867
1868 The "Invariant Sections" are certain Secondary Sections whose
1869 titles are designated, as being those of Invariant Sections, in
1870 the notice that says that the Document is released under this
1871 License. If a section does not fit the above definition of
1872 Secondary then it is not allowed to be designated as Invariant.
1873 The Document may contain zero Invariant Sections. If the Document
1874 does not identify any Invariant Sections then there are none.
1875
1876 The "Cover Texts" are certain short passages of text that are
1877 listed, as Front-Cover Texts or Back-Cover Texts, in the notice
1878 that says that the Document is released under this License. A
1879 Front-Cover Text may be at most 5 words, and a Back-Cover Text may
1880 be at most 25 words.
1881
1882 A "Transparent" copy of the Document means a machine-readable copy,
1883 represented in a format whose specification is available to the
1884 general public, that is suitable for revising the document
1885 straightforwardly with generic text editors or (for images
1886 composed of pixels) generic paint programs or (for drawings) some
1887 widely available drawing editor, and that is suitable for input to
1888 text formatters or for automatic translation to a variety of
1889 formats suitable for input to text formatters. A copy made in an
1890 otherwise Transparent file format whose markup, or absence of
1891 markup, has been arranged to thwart or discourage subsequent
1892 modification by readers is not Transparent. An image format is
1893 not Transparent if used for any substantial amount of text. A
1894 copy that is not "Transparent" is called "Opaque".
1895
1896 Examples of suitable formats for Transparent copies include plain
1897 ASCII without markup, Texinfo input format, LaTeX input format,
1898 SGML or XML using a publicly available DTD, and
1899 standard-conforming simple HTML, PostScript or PDF designed for
1900 human modification. Examples of transparent image formats include
1901 PNG, XCF and JPG. Opaque formats include proprietary formats that
1902 can be read and edited only by proprietary word processors, SGML or
1903 XML for which the DTD and/or processing tools are not generally
1904 available, and the machine-generated HTML, PostScript or PDF
1905 produced by some word processors for output purposes only.
1906
1907 The "Title Page" means, for a printed book, the title page itself,
1908 plus such following pages as are needed to hold, legibly, the
1909 material this License requires to appear in the title page. For
1910 works in formats which do not have any title page as such, "Title
1911 Page" means the text near the most prominent appearance of the
1912 work's title, preceding the beginning of the body of the text.
1913
1914 A section "Entitled XYZ" means a named subunit of the Document
1915 whose title either is precisely XYZ or contains XYZ in parentheses
1916 following text that translates XYZ in another language. (Here XYZ
1917 stands for a specific section name mentioned below, such as
1918 "Acknowledgements", "Dedications", "Endorsements", or "History".)
1919 To "Preserve the Title" of such a section when you modify the
1920 Document means that it remains a section "Entitled XYZ" according
1921 to this definition.
1922
1923 The Document may include Warranty Disclaimers next to the notice
1924 which states that this License applies to the Document. These
1925 Warranty Disclaimers are considered to be included by reference in
1926 this License, but only as regards disclaiming warranties: any other
1927 implication that these Warranty Disclaimers may have is void and
1928 has no effect on the meaning of this License.
1929
1930 2. VERBATIM COPYING
1931
1932 You may copy and distribute the Document in any medium, either
1933 commercially or noncommercially, provided that this License, the
1934 copyright notices, and the license notice saying this License
1935 applies to the Document are reproduced in all copies, and that you
1936 add no other conditions whatsoever to those of this License. You
1937 may not use technical measures to obstruct or control the reading
1938 or further copying of the copies you make or distribute. However,
1939 you may accept compensation in exchange for copies. If you
1940 distribute a large enough number of copies you must also follow
1941 the conditions in section 3.
1942
1943 You may also lend copies, under the same conditions stated above,
1944 and you may publicly display copies.
1945
1946 3. COPYING IN QUANTITY
1947
1948 If you publish printed copies (or copies in media that commonly
1949 have printed covers) of the Document, numbering more than 100, and
1950 the Document's license notice requires Cover Texts, you must
1951 enclose the copies in covers that carry, clearly and legibly, all
1952 these Cover Texts: Front-Cover Texts on the front cover, and
1953 Back-Cover Texts on the back cover. Both covers must also clearly
1954 and legibly identify you as the publisher of these copies. The
1955 front cover must present the full title with all words of the
1956 title equally prominent and visible. You may add other material
1957 on the covers in addition. Copying with changes limited to the
1958 covers, as long as they preserve the title of the Document and
1959 satisfy these conditions, can be treated as verbatim copying in
1960 other respects.
1961
1962 If the required texts for either cover are too voluminous to fit
1963 legibly, you should put the first ones listed (as many as fit
1964 reasonably) on the actual cover, and continue the rest onto
1965 adjacent pages.
1966
1967 If you publish or distribute Opaque copies of the Document
1968 numbering more than 100, you must either include a
1969 machine-readable Transparent copy along with each Opaque copy, or
1970 state in or with each Opaque copy a computer-network location from
1971 which the general network-using public has access to download
1972 using public-standard network protocols a complete Transparent
1973 copy of the Document, free of added material. If you use the
1974 latter option, you must take reasonably prudent steps, when you
1975 begin distribution of Opaque copies in quantity, to ensure that
1976 this Transparent copy will remain thus accessible at the stated
1977 location until at least one year after the last time you
1978 distribute an Opaque copy (directly or through your agents or
1979 retailers) of that edition to the public.
1980
1981 It is requested, but not required, that you contact the authors of
1982 the Document well before redistributing any large number of
1983 copies, to give them a chance to provide you with an updated
1984 version of the Document.
1985
1986 4. MODIFICATIONS
1987
1988 You may copy and distribute a Modified Version of the Document
1989 under the conditions of sections 2 and 3 above, provided that you
1990 release the Modified Version under precisely this License, with
1991 the Modified Version filling the role of the Document, thus
1992 licensing distribution and modification of the Modified Version to
1993 whoever possesses a copy of it. In addition, you must do these
1994 things in the Modified Version:
1995
1996 A. Use in the Title Page (and on the covers, if any) a title
1997 distinct from that of the Document, and from those of
1998 previous versions (which should, if there were any, be listed
1999 in the History section of the Document). You may use the
2000 same title as a previous version if the original publisher of
2001 that version gives permission.
2002
2003 B. List on the Title Page, as authors, one or more persons or
2004 entities responsible for authorship of the modifications in
2005 the Modified Version, together with at least five of the
2006 principal authors of the Document (all of its principal
2007 authors, if it has fewer than five), unless they release you
2008 from this requirement.
2009
2010 C. State on the Title page the name of the publisher of the
2011 Modified Version, as the publisher.
2012
2013 D. Preserve all the copyright notices of the Document.
2014
2015 E. Add an appropriate copyright notice for your modifications
2016 adjacent to the other copyright notices.
2017
2018 F. Include, immediately after the copyright notices, a license
2019 notice giving the public permission to use the Modified
2020 Version under the terms of this License, in the form shown in
2021 the Addendum below.
2022
2023 G. Preserve in that license notice the full lists of Invariant
2024 Sections and required Cover Texts given in the Document's
2025 license notice.
2026
2027 H. Include an unaltered copy of this License.
2028
2029 I. Preserve the section Entitled "History", Preserve its Title,
2030 and add to it an item stating at least the title, year, new
2031 authors, and publisher of the Modified Version as given on
2032 the Title Page. If there is no section Entitled "History" in
2033 the Document, create one stating the title, year, authors,
2034 and publisher of the Document as given on its Title Page,
2035 then add an item describing the Modified Version as stated in
2036 the previous sentence.
2037
2038 J. Preserve the network location, if any, given in the Document
2039 for public access to a Transparent copy of the Document, and
2040 likewise the network locations given in the Document for
2041 previous versions it was based on. These may be placed in
2042 the "History" section. You may omit a network location for a
2043 work that was published at least four years before the
2044 Document itself, or if the original publisher of the version
2045 it refers to gives permission.
2046
2047 K. For any section Entitled "Acknowledgements" or "Dedications",
2048 Preserve the Title of the section, and preserve in the
2049 section all the substance and tone of each of the contributor
2050 acknowledgements and/or dedications given therein.
2051
2052 L. Preserve all the Invariant Sections of the Document,
2053 unaltered in their text and in their titles. Section numbers
2054 or the equivalent are not considered part of the section
2055 titles.
2056
2057 M. Delete any section Entitled "Endorsements". Such a section
2058 may not be included in the Modified Version.
2059
2060 N. Do not retitle any existing section to be Entitled
2061 "Endorsements" or to conflict in title with any Invariant
2062 Section.
2063
2064 O. Preserve any Warranty Disclaimers.
2065
2066 If the Modified Version includes new front-matter sections or
2067 appendices that qualify as Secondary Sections and contain no
2068 material copied from the Document, you may at your option
2069 designate some or all of these sections as invariant. To do this,
2070 add their titles to the list of Invariant Sections in the Modified
2071 Version's license notice. These titles must be distinct from any
2072 other section titles.
2073
2074 You may add a section Entitled "Endorsements", provided it contains
2075 nothing but endorsements of your Modified Version by various
2076 parties--for example, statements of peer review or that the text
2077 has been approved by an organization as the authoritative
2078 definition of a standard.
2079
2080 You may add a passage of up to five words as a Front-Cover Text,
2081 and a passage of up to 25 words as a Back-Cover Text, to the end
2082 of the list of Cover Texts in the Modified Version. Only one
2083 passage of Front-Cover Text and one of Back-Cover Text may be
2084 added by (or through arrangements made by) any one entity. If the
2085 Document already includes a cover text for the same cover,
2086 previously added by you or by arrangement made by the same entity
2087 you are acting on behalf of, you may not add another; but you may
2088 replace the old one, on explicit permission from the previous
2089 publisher that added the old one.
2090
2091 The author(s) and publisher(s) of the Document do not by this
2092 License give permission to use their names for publicity for or to
2093 assert or imply endorsement of any Modified Version.
2094
2095 5. COMBINING DOCUMENTS
2096
2097 You may combine the Document with other documents released under
2098 this License, under the terms defined in section 4 above for
2099 modified versions, provided that you include in the combination
2100 all of the Invariant Sections of all of the original documents,
2101 unmodified, and list them all as Invariant Sections of your
2102 combined work in its license notice, and that you preserve all
2103 their Warranty Disclaimers.
2104
2105 The combined work need only contain one copy of this License, and
2106 multiple identical Invariant Sections may be replaced with a single
2107 copy. If there are multiple Invariant Sections with the same name
2108 but different contents, make the title of each such section unique
2109 by adding at the end of it, in parentheses, the name of the
2110 original author or publisher of that section if known, or else a
2111 unique number. Make the same adjustment to the section titles in
2112 the list of Invariant Sections in the license notice of the
2113 combined work.
2114
2115 In the combination, you must combine any sections Entitled
2116 "History" in the various original documents, forming one section
2117 Entitled "History"; likewise combine any sections Entitled
2118 "Acknowledgements", and any sections Entitled "Dedications". You
2119 must delete all sections Entitled "Endorsements."
2120
2121 6. COLLECTIONS OF DOCUMENTS
2122
2123 You may make a collection consisting of the Document and other
2124 documents released under this License, and replace the individual
2125 copies of this License in the various documents with a single copy
2126 that is included in the collection, provided that you follow the
2127 rules of this License for verbatim copying of each of the
2128 documents in all other respects.
2129
2130 You may extract a single document from such a collection, and
2131 distribute it individually under this License, provided you insert
2132 a copy of this License into the extracted document, and follow
2133 this License in all other respects regarding verbatim copying of
2134 that document.
2135
2136 7. AGGREGATION WITH INDEPENDENT WORKS
2137
2138 A compilation of the Document or its derivatives with other
2139 separate and independent documents or works, in or on a volume of
2140 a storage or distribution medium, is called an "aggregate" if the
2141 copyright resulting from the compilation is not used to limit the
2142 legal rights of the compilation's users beyond what the individual
2143 works permit. When the Document is included in an aggregate, this
2144 License does not apply to the other works in the aggregate which
2145 are not themselves derivative works of the Document.
2146
2147 If the Cover Text requirement of section 3 is applicable to these
2148 copies of the Document, then if the Document is less than one half
2149 of the entire aggregate, the Document's Cover Texts may be placed
2150 on covers that bracket the Document within the aggregate, or the
2151 electronic equivalent of covers if the Document is in electronic
2152 form. Otherwise they must appear on printed covers that bracket
2153 the whole aggregate.
2154
2155 8. TRANSLATION
2156
2157 Translation is considered a kind of modification, so you may
2158 distribute translations of the Document under the terms of section
2159 4. Replacing Invariant Sections with translations requires special
2160 permission from their copyright holders, but you may include
2161 translations of some or all Invariant Sections in addition to the
2162 original versions of these Invariant Sections. You may include a
2163 translation of this License, and all the license notices in the
2164 Document, and any Warranty Disclaimers, provided that you also
2165 include the original English version of this License and the
2166 original versions of those notices and disclaimers. In case of a
2167 disagreement between the translation and the original version of
2168 this License or a notice or disclaimer, the original version will
2169 prevail.
2170
2171 If a section in the Document is Entitled "Acknowledgements",
2172 "Dedications", or "History", the requirement (section 4) to
2173 Preserve its Title (section 1) will typically require changing the
2174 actual title.
2175
2176 9. TERMINATION
2177
2178 You may not copy, modify, sublicense, or distribute the Document
2179 except as expressly provided for under this License. Any other
2180 attempt to copy, modify, sublicense or distribute the Document is
2181 void, and will automatically terminate your rights under this
2182 License. However, parties who have received copies, or rights,
2183 from you under this License will not have their licenses
2184 terminated so long as such parties remain in full compliance.
2185
2186 10. FUTURE REVISIONS OF THIS LICENSE
2187
2188 The Free Software Foundation may publish new, revised versions of
2189 the GNU Free Documentation License from time to time. Such new
2190 versions will be similar in spirit to the present version, but may
2191 differ in detail to address new problems or concerns. See
2192 `http://www.gnu.org/copyleft/'.
2193
2194 Each version of the License is given a distinguishing version
2195 number. If the Document specifies that a particular numbered
2196 version of this License "or any later version" applies to it, you
2197 have the option of following the terms and conditions either of
2198 that specified version or of any later version that has been
2199 published (not as a draft) by the Free Software Foundation. If
2200 the Document does not specify a version number of this License,
2201 you may choose any version ever published (not as a draft) by the
2202 Free Software Foundation.
2203
2204E.0.1 ADDENDUM: How to use this License for your documents
2205----------------------------------------------------------
2206
2207To use this License in a document you have written, include a copy of
2208the License in the document and put the following copyright and license
2209notices just after the title page:
2210
2211 Copyright (C) YEAR YOUR NAME.
2212 Permission is granted to copy, distribute and/or modify this document
2213 under the terms of the GNU Free Documentation License, Version 1.2
2214 or any later version published by the Free Software Foundation;
2215 with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
2216 A copy of the license is included in the section entitled ``GNU
2217 Free Documentation License''.
2218
2219If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
2220replace the "with...Texts." line with this:
2221
2222 with the Invariant Sections being LIST THEIR TITLES, with
2223 the Front-Cover Texts being LIST, and with the Back-Cover Texts
2224 being LIST.
2225
2226If you have Invariant Sections without Cover Texts, or some other
2227combination of the three, merge those two alternatives to suit the
2228situation.
2229
2230If your document contains nontrivial examples of program code, we
2231recommend releasing these examples in parallel under your choice of
2232free software license, such as the GNU General Public License, to
2233permit their use in free software.
2234
2235
2236File: eintr, Node: Index, Next: About the Author, Prev: GNU Free Documentation License, Up: Top
2237
2238Index
2239*****
2240
2241
2242* Menu:
2243
2244* % (remainder function): Compute a Remainder. (line 6)
2245* (debug) in code: debug-on-quit. (line 13)
2246* * (multiplication): defun. (line 101)
2247* * for read-only buffer: Read-only buffer. (line 6)
2248* *scratch* buffer: print-elements-of-list.
2249 (line 9)
2250* .emacs file: Emacs Initialization.
2251 (line 6)
2252* .emacs file, beginning of: Beginning a .emacs File.
2253 (line 6)
2254* / (division): Large buffer case. (line 38)
2255* <= (less than or equal): Inc Example parts. (line 47)
2256* > (greater than): if in more detail. (line 32)
2257* Accumulate, type of recursive pattern: Accumulate. (line 6)
2258* add-hook: Text and Auto-fill. (line 55)
2259* and <1>: fwd-para let. (line 45)
2260* and: kill-new function. (line 213)
2261* Anonymous function: lambda. (line 6)
2262* append-to-buffer: append-to-buffer. (line 6)
2263* apply: Columns of a graph. (line 141)
2264* apropos: Columns of a graph. (line 32)
2265* Argument as local variable: Dec Example altogether.
2266 (line 27)
2267* argument defined: Arguments. (line 16)
2268* argument list defined: defun. (line 60)
2269* Argument, wrong type of: Wrong Type of Argument.
2270 (line 6)
2271* Arguments: Arguments. (line 6)
2272* Arguments' data types: Data types. (line 6)
2273* Arguments, variable number of: Variable Number of Arguments.
2274 (line 6)
2275* Asterisk for read-only buffer: Read-only buffer. (line 6)
2276* Auto Fill mode turned on: Text and Auto-fill. (line 55)
2277* autoload: Autoload. (line 6)
2278* Automatic mode selection: Text and Auto-fill. (line 23)
2279* Axis, print horizontal: print-X-axis. (line 6)
2280* Axis, print vertical: print-Y-axis. (line 6)
2281* beginning-of-buffer: beginning-of-buffer. (line 6)
2282* bind defined: set & setq. (line 6)
2283* Bindings, key, fixing unpleasant: Miscellaneous. (line 88)
2284* body defined: defun. (line 38)
2285* Body of graph: Readying a Graph. (line 6)
2286* Buffer size: Buffer Size & Locations.
2287 (line 6)
2288* Buffer, history of word: Buffer Names. (line 66)
2289* buffer-file-name: Buffer Names. (line 6)
2290* buffer-menu, bound to key: Keybindings. (line 68)
2291* buffer-name: Buffer Names. (line 6)
2292* Bug, most insidious type: Another Bug. (line 6)
2293* Building robots: Building Robots. (line 6)
2294* Building Tags in the Emacs sources: etags. (line 87)
2295* Byte compiling: Byte Compiling. (line 6)
2296* C language primitives: Primitive Functions. (line 6)
2297* C, a digression into: Digression into C. (line 6)
2298* call defined: Switching Buffers. (line 57)
2299* cancel-debug-on-entry: debug-on-entry. (line 83)
2300* car, introduced: car cdr & cons. (line 6)
2301* cdr, introduced: car cdr & cons. (line 6)
2302* Changing a function definition: Change a defun. (line 6)
2303* Chest of Drawers, metaphor for a symbol: Symbols as Chest. (line 6)
2304* Clipping text: Cutting & Storing Text.
2305 (line 6)
2306* Code installation: Permanent Installation.
2307 (line 6)
2308* command defined: How to Evaluate. (line 11)
2309* Comments in Lisp code: Change a defun. (line 22)
2310* Common Lisp: Lisp History. (line 11)
2311* compare-windows: Keybindings. (line 11)
2312* concat: Data types. (line 11)
2313* cond: Recursion with cond. (line 6)
2314* condition-case: condition-case. (line 6)
2315* Conditional 'twixt two versions of Emacs: Simple Extension. (line 37)
2316* Conditional with if: if. (line 6)
2317* cons, introduced: cons. (line 6)
2318* copy-region-as-kill: copy-region-as-kill. (line 6)
2319* copy-to-buffer: copy-to-buffer. (line 6)
2320* Count words recursively: recursive-count-words.
2321 (line 6)
2322* count-words-in-defun: count-words-in-defun.
2323 (line 99)
2324* count-words-region: count-words-region. (line 6)
2325* Counting: Counting. (line 6)
2326* Counting words in a defun <1>: count-words-in-defun.
2327 (line 6)
2328* Counting words in a defun: Words in a defun. (line 6)
2329* current-buffer: Getting Buffers. (line 6)
2330* current-kill: current-kill. (line 6)
2331* Customizing your .emacs file: Emacs Initialization.
2332 (line 6)
2333* Cutting and storing text: Cutting & Storing Text.
2334 (line 6)
2335* Data types: Data types. (line 6)
2336* debug: debug. (line 6)
2337* debug-on-entry: debug-on-entry. (line 6)
2338* debug-on-quit: debug-on-quit. (line 9)
2339* debugging: Debugging. (line 6)
2340* default-mode-line-format: Mode Line. (line 6)
2341* default.el init file: Site-wide Init. (line 6)
2342* defconst: defcustom. (line 127)
2343* defcustom: defcustom. (line 6)
2344* Deferment in recursion: No Deferment. (line 6)
2345* Defermentless solution: No deferment solution.
2346 (line 6)
2347* Definition installation: Install. (line 6)
2348* Definition writing: Writing Defuns. (line 6)
2349* Definition, how to change: Change a defun. (line 6)
2350* defsubst: defcustom. (line 127)
2351* defun: defun. (line 6)
2352* defvar: defvar. (line 6)
2353* defvar for a user customizable variable: defvar and asterisk.
2354 (line 6)
2355* defvar with an asterisk: defvar and asterisk. (line 6)
2356* delete-and-extract-region: Digression into C. (line 6)
2357* Deleting text: Cutting & Storing Text.
2358 (line 6)
2359* describe-function: simplified-beginning-of-buffer.
2360 (line 78)
2361* describe-function, introduced: Finding More. (line 6)
2362* Digression into C: Digression into C. (line 6)
2363* directory-files: Files List. (line 13)
2364* Division: Large buffer case. (line 38)
2365* dolist: dolist. (line 6)
2366* dotimes: dotimes. (line 6)
2367* Drawers, Chest of, metaphor for a symbol: Symbols as Chest. (line 6)
2368* Duplicated words function: the-the. (line 6)
2369* edebug: edebug. (line 6)
2370* Else: else. (line 6)
2371* Emacs version, choosing: Simple Extension. (line 37)
2372* empty list defined: Lisp Atoms. (line 18)
2373* empty string defined: Review. (line 139)
2374* eobp: fwd-para while. (line 59)
2375* eq: Review. (line 113)
2376* eq (example of use): last-command & this-command.
2377 (line 37)
2378* equal: Review. (line 113)
2379* Erasing text: Cutting & Storing Text.
2380 (line 6)
2381* error: Understanding current-kill.
2382 (line 52)
2383* Error for symbol without function: Void Function. (line 6)
2384* Error for symbol without value: Void Variable. (line 6)
2385* Error message generation: Making Errors. (line 6)
2386* etags: etags. (line 6)
2387* evaluate defined: Run a Program. (line 6)
2388* Evaluating inner lists: Evaluating Inner Lists.
2389 (line 6)
2390* Evaluation: Evaluation. (line 6)
2391* Evaluation practice: Practicing Evaluation.
2392 (line 6)
2393* Every, type of recursive pattern: Every. (line 6)
2394* Example variable, fill-column: fill-column Example. (line 6)
2395* expression defined: Lisp Atoms. (line 25)
2396* Falsehood and truth in Emacs Lisp: Truth & Falsehood. (line 6)
2397* FDL, GNU Free Documentation License: GNU Free Documentation License.
2398 (line 6)
2399* files-in-below-directory: Files List. (line 26)
2400* fill-column, an example variable: fill-column Example. (line 6)
2401* filter-buffer-substring: last-command & this-command.
2402 (line 30)
2403* Find a File: Find a File. (line 6)
2404* Find function documentation: Finding More. (line 6)
2405* Find source of function: Finding More. (line 13)
2406* find-tags: Finding More. (line 40)
2407* Flowers in a field: Lisp Lists. (line 18)
2408* Focusing attention (narrowing): Narrowing & Widening.
2409 (line 6)
2410* form defined: Lisp Atoms. (line 25)
2411* Formatting convention: append save-excursion.
2412 (line 15)
2413* Formatting help: Typing Lists. (line 6)
2414* forward-paragraph: forward-paragraph. (line 6)
2415* forward-sentence: forward-sentence. (line 6)
2416* function defined: Making Errors. (line 51)
2417* function definition defined: defun. (line 6)
2418* Function definition installation: Install. (line 6)
2419* Function definition writing: Writing Defuns. (line 6)
2420* Function definition, how to change: Change a defun. (line 6)
2421* Functions, primitive: Primitive Functions. (line 6)
2422* Generate an error message: Making Errors. (line 6)
2423* Getting a buffer: Getting Buffers. (line 6)
2424* Global set key: Keybindings. (line 18)
2425* global variable defined: Determining the Element.
2426 (line 88)
2427* global-set-key: Keybindings. (line 18)
2428* global-unset-key: Keybindings. (line 57)
2429* Graph prototype: Readying a Graph. (line 6)
2430* Graph, printing all: Print Whole Graph. (line 6)
2431* graph-body-print: graph-body-print. (line 6)
2432* graph-body-print Final version.: The final version. (line 53)
2433* Handling the kill ring: Kill Ring. (line 6)
2434* Help typing lists: Typing Lists. (line 6)
2435* Horizontal axis printing: print-X-axis. (line 6)
2436* if: if. (line 6)
2437* if-part defined: if in more detail. (line 6)
2438* indent-tabs-mode: Indent Tabs Mode. (line 6)
2439* Indentation for formatting: append save-excursion.
2440 (line 15)
2441* Initialization file: Emacs Initialization.
2442 (line 6)
2443* Initializing a variable: defvar. (line 6)
2444* Inner list evaluation: Evaluating Inner Lists.
2445 (line 6)
2446* insert-buffer: insert-buffer. (line 6)
2447* insert-buffer, new version body: New insert-buffer. (line 6)
2448* insert-buffer-substring: append-to-buffer overview.
2449 (line 6)
2450* Insidious type of bug: Another Bug. (line 6)
2451* Install a Function Definition: Install. (line 6)
2452* Install code permanently: Permanent Installation.
2453 (line 6)
2454* interactive: Interactive. (line 6)
2455* interactive function defined: How to Evaluate. (line 11)
2456* Interactive functions: Interactive. (line 6)
2457* Interactive options: Interactive Options. (line 6)
2458* interactive, example use of: insert-buffer interactive.
2459 (line 6)
2460* Interpreter, Lisp, explained: Run a Program. (line 39)
2461* Interpreter, what it does: Lisp Interpreter. (line 6)
2462* Keep, type of recursive pattern: Keep. (line 6)
2463* Key bindings, fixing: Miscellaneous. (line 88)
2464* Key setting globally: Keybindings. (line 18)
2465* Key unbinding: Keybindings. (line 57)
2466* Keymaps: Keymaps. (line 6)
2467* Keyword: Optional Arguments. (line 11)
2468* Kill ring handling: Kill Ring. (line 6)
2469* Kill ring overview: Kill Ring Overview. (line 6)
2470* kill-append: kill-append function.
2471 (line 6)
2472* kill-new: kill-new function. (line 6)
2473* kill-region: kill-region. (line 6)
2474* Killing text: Cutting & Storing Text.
2475 (line 6)
2476* lambda: lambda. (line 6)
2477* length: length. (line 6)
2478* lengths-list-file: lengths-list-file. (line 11)
2479* lengths-list-many-files: lengths-list-many-files.
2480 (line 33)
2481* let: let. (line 6)
2482* let expression sample: Sample let Expression.
2483 (line 6)
2484* let expression, parts of: Parts of let Expression.
2485 (line 6)
2486* let variables uninitialized: Uninitialized let Variables.
2487 (line 6)
2488* Library, as term for `file': Finding More. (line 64)
2489* line-to-top-of-window: Simple Extension. (line 6)
2490* Lisp Atoms: Lisp Atoms. (line 6)
2491* Lisp history: Lisp History. (line 6)
2492* Lisp interpreter, explained: Run a Program. (line 39)
2493* Lisp interpreter, what it does: Lisp Interpreter. (line 6)
2494* Lisp Lists: Lisp Lists. (line 6)
2495* Lisp macro: Lisp macro. (line 6)
2496* list-buffers, rebound: Keybindings. (line 68)
2497* Lists in a computer: List Implementation. (line 6)
2498* load-library: Loading Files. (line 52)
2499* load-path: Loading Files. (line 36)
2500* Loading files: Loading Files. (line 6)
2501* local variable defined: Prevent confusion. (line 6)
2502* Local variables list, per-buffer,: Text and Auto-fill. (line 23)
2503* Location of point: Buffer Size & Locations.
2504 (line 6)
2505* looking-at: fwd-para while. (line 81)
2506* Loops: while. (line 6)
2507* Loops and recursion: Loops & Recursion. (line 6)
2508* Maclisp: Lisp History. (line 11)
2509* Macro, lisp: Lisp macro. (line 6)
2510* Mail aliases: Mail Aliases. (line 16)
2511* make tags: etags. (line 87)
2512* make-string: Y Axis Element. (line 74)
2513* mapcar: mapcar. (line 6)
2514* mark: save-excursion. (line 6)
2515* mark-whole-buffer: mark-whole-buffer. (line 6)
2516* match-beginning: fwd-para while. (line 158)
2517* max: Columns of a graph. (line 129)
2518* message: message. (line 6)
2519* min: Columns of a graph. (line 129)
2520* Mode line format: Mode Line. (line 6)
2521* Mode selection, automatic: Text and Auto-fill. (line 23)
2522* Motion by sentence and paragraph: Regexp Search. (line 6)
2523* Narrowing: Narrowing & Widening.
2524 (line 6)
2525* narrowing defined: Buffer Size & Locations.
2526 (line 40)
2527* new version body for insert-buffer: New insert-buffer. (line 6)
2528* nil: Truth & Falsehood. (line 6)
2529* nil, history of word: Buffer Names. (line 42)
2530* No deferment solution: No deferment solution.
2531 (line 6)
2532* nreverse: Counting function definitions.
2533 (line 100)
2534* nth: nth. (line 6)
2535* nthcdr <1>: copy-region-as-kill. (line 6)
2536* nthcdr: nthcdr. (line 6)
2537* nthcdr, example: kill-new function. (line 149)
2538* number-to-string: Y Axis Element. (line 13)
2539* occur: Keybindings. (line 52)
2540* optional: Optional Arguments. (line 11)
2541* Optional arguments: Optional Arguments. (line 11)
2542* Options for interactive: Interactive Options. (line 6)
2543* or: Insert or. (line 13)
2544* other-buffer: Getting Buffers. (line 6)
2545* Paragraphs, movement by: Regexp Search. (line 6)
2546* Parts of a Recursive Definition: Recursive Definition Parts.
2547 (line 6)
2548* Parts of let expression: Parts of let Expression.
2549 (line 6)
2550* Passing information to functions: Arguments. (line 6)
2551* Pasting text: Yanking. (line 6)
2552* Patterns, searching for: Regexp Search. (line 6)
2553* Per-buffer, local variables list: Text and Auto-fill. (line 23)
2554* Permanent code installation: Permanent Installation.
2555 (line 6)
2556* point: save-excursion. (line 6)
2557* point defined: Buffer Size & Locations.
2558 (line 19)
2559* Point location: Buffer Size & Locations.
2560 (line 6)
2561* Point, mark, buffer preservation: save-excursion. (line 6)
2562* Practicing evaluation: Practicing Evaluation.
2563 (line 6)
2564* Preserving point, mark, and buffer: save-excursion. (line 6)
2565* Primitive functions: Primitive Functions. (line 6)
2566* Primitives written in C: Primitive Functions. (line 6)
2567* Print horizontal axis: print-X-axis. (line 6)
2568* Print vertical axis: print-Y-axis. (line 6)
2569* print-elements-of-list: print-elements-of-list.
2570 (line 6)
2571* print-elements-recursively: Recursion with list. (line 24)
2572* print-graph Final version.: The final version. (line 75)
2573* print-graph varlist: print-graph Varlist. (line 6)
2574* print-X-axis: X Axis Tic Marks. (line 146)
2575* print-X-axis-numbered-line: X Axis Tic Marks. (line 116)
2576* print-X-axis-tic-line: X Axis Tic Marks. (line 82)
2577* print-Y-axis: print-Y-axis Penultimate.
2578 (line 9)
2579* Printing the whole graph: Print Whole Graph. (line 6)
2580* progn: progn. (line 6)
2581* Program, running one: Run a Program. (line 6)
2582* Properties, in mode line example: Mode Line. (line 64)
2583* Properties, mention of buffer-substring-no-properties: narrow Exercise.
2584 (line 13)
2585* Prototype graph: Readying a Graph. (line 6)
2586* push, example: kill-new function. (line 118)
2587* re-search-forward: re-search-forward. (line 6)
2588* Read-only buffer: Read-only buffer. (line 6)
2589* Readying a graph: Readying a Graph. (line 6)
2590* Rebinding keys: Keymaps. (line 6)
2591* Recursion: Recursion. (line 6)
2592* Recursion and loops: Loops & Recursion. (line 6)
2593* Recursion without Deferments: No Deferment. (line 6)
2594* Recursive Definition Parts: Recursive Definition Parts.
2595 (line 6)
2596* Recursive pattern: accumulate: Accumulate. (line 6)
2597* Recursive pattern: every: Every. (line 6)
2598* Recursive pattern: keep: Keep. (line 6)
2599* Recursive Patterns: Recursive Patterns. (line 6)
2600* recursive-count-words: recursive-count-words.
2601 (line 258)
2602* recursive-graph-body-print: recursive-graph-body-print.
2603 (line 6)
2604* recursive-lengths-list-many-files: Several files recursively.
2605 (line 17)
2606* Recursively counting words: recursive-count-words.
2607 (line 6)
2608* regexp-quote: fwd-para let. (line 73)
2609* Region, what it is: save-excursion. (line 6)
2610* Regular expression searches: Regexp Search. (line 6)
2611* Regular expressions for word counting: Counting Words. (line 6)
2612* Remainder function, %: Compute a Remainder. (line 6)
2613* Repetition (loops): Loops & Recursion. (line 6)
2614* Repetition for word counting: Counting Words. (line 6)
2615* Retrieving text: Yanking. (line 6)
2616* reverse: Counting function definitions.
2617 (line 115)
2618* Ring, making a list like a: Kill Ring. (line 6)
2619* ring.el file: ring file. (line 6)
2620* Robots, building: Building Robots. (line 6)
2621* rotate-yank-pointer: Yanking. (line 6)
2622* Run a program: Run a Program. (line 6)
2623* Sample let expression: Sample let Expression.
2624 (line 6)
2625* save-excursion: save-excursion. (line 6)
2626* save-restriction: save-restriction. (line 6)
2627* search-forward: search-forward. (line 6)
2628* Searches, illustrating: Regexp Search. (line 6)
2629* sentence-end: sentence-end. (line 6)
2630* Sentences, movement by: Regexp Search. (line 6)
2631* set: Using set. (line 6)
2632* set-buffer: Switching Buffers. (line 6)
2633* set-variable: defvar and asterisk. (line 22)
2634* setcar: setcar. (line 6)
2635* setcdr: setcdr. (line 6)
2636* setcdr, example: kill-new function. (line 153)
2637* setq: Using setq. (line 6)
2638* Setting a key globally: Keybindings. (line 18)
2639* Setting value of variable: set & setq. (line 6)
2640* side effect defined: Evaluation. (line 22)
2641* Simple extension in .emacs file: Simple Extension. (line 6)
2642* simplified-beginning-of-buffer: simplified-beginning-of-buffer.
2643 (line 6)
2644* site-init.el init file: Site-wide Init. (line 6)
2645* site-load.el init file: Site-wide Init. (line 6)
2646* Size of buffer: Buffer Size & Locations.
2647 (line 6)
2648* Solution without deferment: No deferment solution.
2649 (line 6)
2650* sort: Sorting. (line 6)
2651* Source level debugger: edebug. (line 6)
2652* Special form: Complications. (line 12)
2653* Special form of defun: defun. (line 6)
2654* Storing and cutting text: Cutting & Storing Text.
2655 (line 6)
2656* string defined: Lisp Atoms. (line 64)
2657* switch-to-buffer: Switching Buffers. (line 6)
2658* Switching to a buffer: Switching Buffers. (line 6)
2659* Symbol names: Names & Definitions. (line 6)
2660* Symbol without function error: Void Function. (line 6)
2661* Symbol without value error: Void Variable. (line 6)
2662* Symbolic expressions, introduced: Lisp Atoms. (line 25)
2663* Symbols as a Chest of Drawers: Symbols as Chest. (line 6)
2664* Syntax categories and tables: Syntax. (line 6)
2665* Tabs, preventing: Indent Tabs Mode. (line 6)
2666* TAGS file, create own: etags. (line 6)
2667* Tags in the Emacs sources: etags. (line 87)
2668* TAGS table, specifying: Finding More. (line 40)
2669* Text between double quotation marks: Lisp Atoms. (line 60)
2670* Text Mode turned on: Text and Auto-fill. (line 40)
2671* Text retrieval: Yanking. (line 6)
2672* the-the: the-the. (line 6)
2673* then-part defined: if in more detail. (line 6)
2674* top-of-ranges: Counting function definitions.
2675 (line 20)
2676* triangle-bugged: debug. (line 14)
2677* triangle-recursively: Recursive triangle function.
2678 (line 6)
2679* Truth and falsehood in Emacs Lisp: Truth & Falsehood. (line 6)
2680* Types of data: Data types. (line 6)
2681* Unbinding key: Keybindings. (line 57)
2682* Uninitialized let variables: Uninitialized let Variables.
2683 (line 6)
2684* Variable initialization: defvar. (line 6)
2685* Variable number of arguments: Variable Number of Arguments.
2686 (line 6)
2687* Variable, example of, fill-column: fill-column Example. (line 6)
2688* variable, global, defined: Determining the Element.
2689 (line 88)
2690* variable, local, defined: Prevent confusion. (line 6)
2691* Variable, setting value: set & setq. (line 6)
2692* Variables: Variables. (line 6)
2693* varlist defined: Parts of let Expression.
2694 (line 6)
2695* Version of Emacs, choosing: Simple Extension. (line 37)
2696* Vertical axis printing: print-Y-axis. (line 6)
2697* what-line: what-line. (line 6)
2698* while: while. (line 6)
2699* Whitespace in lists: Whitespace in Lists. (line 6)
2700* Whole graph printing: Print Whole Graph. (line 6)
2701* Widening: Narrowing & Widening.
2702 (line 6)
2703* Widening, example of: what-line. (line 6)
2704* Word counting in a defun: Words in a defun. (line 6)
2705* Words and symbols in defun: Words and Symbols. (line 6)
2706* Words, counted recursively: recursive-count-words.
2707 (line 6)
2708* Words, duplicated: the-the. (line 6)
2709* Writing a function definition: Writing Defuns. (line 6)
2710* Wrong type of argument: Wrong Type of Argument.
2711 (line 6)
2712* X axis printing: print-X-axis. (line 6)
2713* X-axis-element: X Axis Tic Marks. (line 105)
2714* Y axis printing: print-Y-axis. (line 6)
2715* Y-axis-column: Y-axis-column. (line 10)
2716* Y-axis-column Final version.: The final version. (line 15)
2717* Y-axis-label-spacing: Compute a Remainder. (line 79)
2718* Y-axis-tic: Y Axis Element. (line 32)
2719* yank <1>: yank. (line 6)
2720* yank: Yanking. (line 6)
2721* yank-pop: yank-pop. (line 6)
2722* zap-to-char: zap-to-char. (line 6)
2723* zerop: Understanding current-kill.
2724 (line 52)
2725
2726
2727File: eintr, Node: About the Author, Prev: Index, Up: Top
2728
2729About the Author
2730****************
2731
2732 Robert J. Chassell has worked with GNU Emacs since 1985. He writes
2733 and edits, teaches Emacs and Emacs Lisp, and speaks throughout the
2734 world on software freedom. Chassell was a founding Director and
2735 Treasurer of the Free Software Foundation, Inc. He is co-author of
2736 the `Texinfo' manual, and has edited more than a dozen other
2737 books. He graduated from Cambridge University, in England. He
2738 has an abiding interest in social and economic history and flies
2739 his own airplane.
2740
2741
2742
2743