annotate man/cl.texi @ 778:2923009caf47

[xemacs-hg @ 2002-03-16 10:38:59 by ben] cm.c, file-coding.c: fix warnings. .cvsignore: Those pesky *.tmp files. mule\arabic.el, mule\canna-leim.el, mule\china-util.el, mule\chinese.el, mule\cyril-util.el, mule\cyrillic.el, mule\devan-util.el, mule\devanagari.el, mule\english.el, mule\ethio-util.el, mule\ethiopic.el, mule\european.el, mule\greek.el, mule\hebrew.el, mule\indian.el, mule\japan-util.el, mule\japanese.el, mule\korea-util.el, mule\korean.el, mule\lao-util.el, mule\lao.el, mule\misc-lang.el, mule\mule-charset.el, mule\mule-cmds.el, mule\thai-util.el, mule\thai.el, mule\tibet-util.el, mule\tibetan.el, mule\viet-util.el, mule\vietnamese.el, unicode.el: Fix lots of warnings. Sync up some files to FSF 21.1. Copy over all charset definitions from FSF 21.1, convert them to our format, and stick them in the relevant files. Eventually we will actually be able to dump these files (though they may not quite work). autoload.el: Support defun*, defmacro*. mule/mule-composite.el, mule/mule-composite-stub.el: New file, stubs for nonexistent composition funs/vars. mule/viet-chars.el, dumped-lisp.el: Account for these changes. font.el, mouse.el, msw-font-menu.el, printer.el, startup.el: fix warnings.
author ben
date Sat, 16 Mar 2002 10:39:19 +0000
parents 1ccc32a20af4
children b234386a35eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 \input texinfo @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @setfilename ../info/cl.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 @settitle Common Lisp Extensions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @finalout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 @dircategory XEmacs Editor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 @direntry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 * Common Lisp: (cl). GNU Emacs Common Lisp emulation package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 @end direntry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 This file documents the GNU Emacs Common Lisp emulation package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 Copyright (C) 1993 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 Permission is granted to make and distribute verbatim copies of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 manual provided the copyright notice and this permission notice are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 preserved on all copies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 Permission is granted to process this file through TeX and print the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 results, provided the printed document carries copying permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 identical to this one except for the removal of this paragraph (this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 paragraph not being relevant to the printed manual).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 Permission is granted to copy and distribute modified versions of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 manual under the conditions for verbatim copying, provided also that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 section entitled ``GNU General Public License'' is included exactly as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 in the original, and provided that the entire resulting derived work is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 distributed under the terms of a permission notice identical to this one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 Permission is granted to copy and distribute translations of this manual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 into another language, under the above conditions for modified versions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 except that the section entitled ``GNU General Public License'' may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 included in a translation approved by the author instead of in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 original English.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 @titlepage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 @sp 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 @center @titlefont{Common Lisp Extensions}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 @sp 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 @center For GNU Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 @sp 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 @center Version 2.02
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 @sp 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 @center Dave Gillespie
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 @center daveg@@synaptics.com
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 @page
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 @vskip 0pt plus 1filll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Copyright @copyright{} 1993 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 Permission is granted to make and distribute verbatim copies of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 this manual provided the copyright notice and this permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 are preserved on all copies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 Permission is granted to process this file through TeX and print the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 results, provided the printed document carries copying permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 identical to this one except for the removal of this paragraph (this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 paragraph not being relevant to the printed manual).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 Permission is granted to copy and distribute modified versions of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 manual under the conditions for verbatim copying, provided also that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 section entitled ``GNU General Public License'' is included exactly as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 in the original, and provided that the entire resulting derived work is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 distributed under the terms of a permission notice identical to this one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 Permission is granted to copy and distribute translations of this manual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 into another language, under the above conditions for modified versions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 except that the section entitled ``GNU General Public License'' may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 included in a translation approved by the author instead of in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 original English.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 @end titlepage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 @node Top, Overview,, (dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 @chapter Common Lisp Extensions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 This document describes a set of Emacs Lisp facilities borrowed from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 Common Lisp. All the facilities are described here in detail; for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 more discussion and examples, Guy L. Steele's @cite{Common Lisp, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 Language}, second edition, is the definitive book on Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 Chapter numbers and most section numbers of this document parallel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 those of Steele's book.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 While this document does not assume any prior knowledge of Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 Lisp, it does assume a basic familiarity with Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 * Overview:: Installation, usage, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 * Program Structure:: Arglists, `eval-when', `defalias'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 * Predicates:: `typep', `eql', and `equalp'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 * Control Structure:: `setf', `when', `do', `loop', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 * Macros:: Destructuring, `define-compiler-macro'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 * Declarations:: `proclaim', `declare', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 * Symbols:: Property lists, `gensym'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 * Numbers:: Predicates, functions, random numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 * Sequences:: Mapping, functions, searching, sorting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 * Lists:: `cadr', `sublis', `member*', `assoc*', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 * Hash Tables:: `make-hash-table', `gethash', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 * Structures:: `defstruct'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 * Assertions:: `check-type', `assert', `ignore-errors'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 * Efficiency Concerns:: Hints and techniques
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 * Common Lisp Compatibility:: All known differences with Steele
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 * Old CL Compatibility:: All known differences with old cl.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 * Porting Common Lisp:: Hints for porting Common Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 * Function Index::
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 * Variable Index::
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 @node Overview, Program Structure, Top, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 @chapter Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 @section Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 Common Lisp is a huge language, and Common Lisp systems tend to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 massive and extremely complex. Emacs Lisp, by contrast, is rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 minimalist in the choice of Lisp features it offers the programmer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 As Emacs Lisp programmers have grown in number, and the applications
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 they write have grown more ambitious, it has become clear that Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 Lisp could benefit from many of the conveniences of Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 The @dfn{CL} package adds a number of Common Lisp functions and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 control structures to Emacs Lisp. While not a 100% complete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 implementation of Common Lisp, @dfn{CL} adds enough functionality
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 to make Emacs Lisp programming significantly more convenient.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 Some Common Lisp features have been omitted from this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 for various reasons:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 Some features are too complex or bulky relative to their benefit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 to Emacs Lisp programmers. CLOS and Common Lisp streams are fine
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 examples of this group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 Other features cannot be implemented without modification to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 Emacs Lisp interpreter itself, such as multiple return values,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 lexical scoping, case-insensitive symbols, and complex numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 The @dfn{CL} package generally makes no attempt to emulate these
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 features.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 Some features conflict with existing things in Emacs Lisp. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 example, Emacs' @code{assoc} function is incompatible with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 Common Lisp @code{assoc}. In such cases, this package usually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 adds the suffix @samp{*} to the function name of the Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 Lisp version of the function (e.g., @code{assoc*}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 The package described here was written by Dave Gillespie,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 @file{daveg@@synaptics.com}. It is a total rewrite of the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 1986 @file{cl.el} package by Cesar Quiroz. Most features of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 the Quiroz package have been retained; any incompatibilities are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 noted in the descriptions below. Care has been taken in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 version to ensure that each function is defined efficiently,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 concisely, and with minimal impact on the rest of the Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 environment.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 * Usage:: How to use the CL package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 * Organization:: The package's five component files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 * Installation:: Compiling and installing CL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 * Naming Conventions:: Notes on CL function names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 @node Usage, Organization, Overview, Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 @section Usage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 Lisp code that uses features from the @dfn{CL} package should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 include at the beginning:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (require 'cl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 If you want to ensure that the new (Gillespie) version of @dfn{CL}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 is the one that is present, add an additional @code{(require 'cl-19)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 call:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 (require 'cl)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 (require 'cl-19)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 The second call will fail (with ``@file{cl-19.el} not found'') if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 the old @file{cl.el} package was in use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 It is safe to arrange to load @dfn{CL} at all times, e.g.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 in your @file{.emacs} file. But it's a good idea, for portability,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 to @code{(require 'cl)} in your code even if you do this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 @node Organization, Installation, Usage, Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 @section Organization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 The Common Lisp package is organized into four files:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 @table @file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 @item cl.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 This is the ``main'' file, which contains basic functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 and information about the package. This file is relatively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 compact---about 700 lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 @item cl-extra.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 This file contains the larger, more complex or unusual functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 It is kept separate so that packages which only want to use Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 Lisp fundamentals like the @code{cadr} function won't need to pay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 the overhead of loading the more advanced functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 @item cl-seq.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 This file contains most of the advanced functions for operating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 on sequences or lists, such as @code{delete-if} and @code{assoc*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 @item cl-macs.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 This file contains the features of the packages which are macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 instead of functions. Macros expand when the caller is compiled,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 not when it is run, so the macros generally only need to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 present when the byte-compiler is running (or when the macros are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 used in uncompiled code such as a @file{.emacs} file). Most of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 the macros of this package are isolated in @file{cl-macs.el} so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 that they won't take up memory unless you are compiling.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 The file @file{cl.el} includes all necessary @code{autoload}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 commands for the functions and macros in the other three files.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 All you have to do is @code{(require 'cl)}, and @file{cl.el}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 will take care of pulling in the other files when they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 There is another file, @file{cl-compat.el}, which defines some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 routines from the older @file{cl.el} package that are no longer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 present in the new package. This includes internal routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 like @code{setelt} and @code{zip-lists}, deprecated features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 like @code{defkeyword}, and an emulation of the old-style
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 multiple-values feature. @xref{Old CL Compatibility}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 @node Installation, Naming Conventions, Organization, Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 @section Installation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 Installation of the @dfn{CL} package is simple: Just put the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 byte-compiled files @file{cl.elc}, @file{cl-extra.elc},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 @file{cl-seq.elc}, @file{cl-macs.elc}, and @file{cl-compat.elc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 into a directory on your @code{load-path}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 There are no special requirements to compile this package:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 The files do not have to be loaded before they are compiled,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 nor do they need to be compiled in any particular order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 You may choose to put the files into your main @file{lisp/}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 directory, replacing the original @file{cl.el} file there. Or,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 you could put them into a directory that comes before @file{lisp/}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 on your @code{load-path} so that the old @file{cl.el} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 effectively hidden.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 Also, format the @file{cl.texinfo} file and put the resulting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 Info files in the @file{info/} directory or another suitable place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 You may instead wish to leave this package's components all in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 their own directory, and then add this directory to your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 @code{load-path} and (Emacs 19 only) @code{Info-directory-list}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 Add the directory to the front of the list so the old @dfn{CL}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 package and its documentation are hidden.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 @node Naming Conventions, , Installation, Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 @section Naming Conventions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 Except where noted, all functions defined by this package have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 same names and calling conventions as their Common Lisp counterparts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 Following is a complete list of functions whose names were changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 from Common Lisp, usually to avoid conflicts with Emacs. In each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 case, a @samp{*} has been appended to the Common Lisp name to obtain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 the Emacs name:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 defun* defsubst* defmacro* function*
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
298 member* assoc* rassoc* remove*
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
299 delete* mapcar* sort* floor*
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
300 ceiling* truncate* round* mod*
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
301 rem* random*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 Internal function and variable names in the package are prefixed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 by @code{cl-}. Here is a complete list of functions @emph{not}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 prefixed by @code{cl-} which were not taken from Common Lisp:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 member delete remove remq
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 rassoc floatp-safe lexical-let lexical-let*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 callf callf2 letf letf*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 defsubst* defalias add-hook eval-when-compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (Most of these are Emacs 19 features provided to Emacs 18 users,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 or introduced, like @code{remq}, for reasons of symmetry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 with similar features.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 The following simple functions and macros are defined in @file{cl.el};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 they do not cause other components like @file{cl-extra} to be loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 eql floatp-safe abs endp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 evenp oddp plusp minusp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 last butlast nbutlast caar .. cddddr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 list* ldiff rest first .. tenth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 member [1] copy-list subst mapcar* [2]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 adjoin [3] acons pairlis when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 unless pop [4] push [4] pushnew [3,4]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 incf [4] decf [4] proclaim declaim
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 add-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 [1] This is the Emacs 19-compatible function, not @code{member*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 [2] Only for one sequence argument or two list arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 [3] Only if @code{:test} is @code{eq}, @code{equal}, or unspecified,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 and @code{:key} is not used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 [4] Only when @var{place} is a plain variable name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 @chapno=4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 @node Program Structure, Predicates, Overview, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 @chapter Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 This section describes features of the @dfn{CL} package which have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 do with programs as a whole: advanced argument lists for functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 and the @code{eval-when} construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 * Argument Lists:: `&key', `&aux', `defun*', `defmacro*'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 * Time of Evaluation:: The `eval-when' construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 * Function Aliases:: The `defalias' function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 @secno=1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 @node Argument Lists, Time of Evaluation, Program Structure, Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 @section Argument Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 Emacs Lisp's notation for argument lists of functions is a subset of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 the Common Lisp notation. As well as the familiar @code{&optional}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 and @code{&rest} markers, Common Lisp allows you to specify default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 values for optional arguments, and it provides the additional markers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 @code{&key} and @code{&aux}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 Since argument parsing is built-in to Emacs, there is no way for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 this package to implement Common Lisp argument lists seamlessly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 Instead, this package defines alternates for several Lisp forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 which you must use if you need Common Lisp argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 @defspec defun* name arglist body...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 This form is identical to the regular @code{defun} form, except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 that @var{arglist} is allowed to be a full Common Lisp argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 list. Also, the function body is enclosed in an implicit block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 called @var{name}; @pxref{Blocks and Exits}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 @defspec defsubst* name arglist body...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 This is just like @code{defun*}, except that the function that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 is defined is automatically proclaimed @code{inline}, i.e.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 calls to it may be expanded into in-line code by the byte compiler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 This is analogous to the @code{defsubst} form in Emacs 19;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 @code{defsubst*} uses a different method (compiler macros) which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 works in all version of Emacs, and also generates somewhat more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 efficient inline expansions. In particular, @code{defsubst*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 arranges for the processing of keyword arguments, default values,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 etc., to be done at compile-time whenever possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 @defspec defmacro* name arglist body...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 This is identical to the regular @code{defmacro} form,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 except that @var{arglist} is allowed to be a full Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 argument list. The @code{&environment} keyword is supported as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 described in Steele. The @code{&whole} keyword is supported only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 within destructured lists (see below); top-level @code{&whole}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 cannot be implemented with the current Emacs Lisp interpreter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 The macro expander body is enclosed in an implicit block called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 @var{name}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 @defspec function* symbol-or-lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 This is identical to the regular @code{function} form,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 except that if the argument is a @code{lambda} form then that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 form may use a full Common Lisp argument list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 Also, all forms (such as @code{defsetf} and @code{flet}) defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 in this package that include @var{arglist}s in their syntax allow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 full Common Lisp argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 Note that it is @emph{not} necessary to use @code{defun*} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 order to have access to most @dfn{CL} features in your function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 These features are always present; @code{defun*}'s only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 difference from @code{defun} is its more flexible argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 lists and its implicit block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 The full form of a Common Lisp argument list is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (@var{var}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 &optional (@var{var} @var{initform} @var{svar})...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 &rest @var{var}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 &key ((@var{keyword} @var{var}) @var{initform} @var{svar})...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 &aux (@var{var} @var{initform})...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 Each of the five argument list sections is optional. The @var{svar},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 @var{initform}, and @var{keyword} parts are optional; if they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 omitted, then @samp{(@var{var})} may be written simply @samp{@var{var}}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 The first section consists of zero or more @dfn{required} arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 These arguments must always be specified in a call to the function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 there is no difference between Emacs Lisp and Common Lisp as far as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 required arguments are concerned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 The second section consists of @dfn{optional} arguments. These
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 arguments may be specified in the function call; if they are not,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 @var{initform} specifies the default value used for the argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (No @var{initform} means to use @code{nil} as the default.) The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 @var{initform} is evaluated with the bindings for the preceding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 arguments already established; @code{(a &optional (b (1+ a)))}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 matches one or two arguments, with the second argument defaulting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 to one plus the first argument. If the @var{svar} is specified,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 it is an auxiliary variable which is bound to @code{t} if the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 argument was specified, or to @code{nil} if the argument was omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 If you don't use an @var{svar}, then there will be no way for your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 function to tell whether it was called with no argument, or with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 the default value passed explicitly as an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 The third section consists of a single @dfn{rest} argument. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 more arguments were passed to the function than are accounted for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 by the required and optional arguments, those extra arguments are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 collected into a list and bound to the ``rest'' argument variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 Common Lisp's @code{&rest} is equivalent to that of Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 Common Lisp accepts @code{&body} as a synonym for @code{&rest} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 macro contexts; this package accepts it all the time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 The fourth section consists of @dfn{keyword} arguments. These
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 are optional arguments which are specified by name rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 positionally in the argument list. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (defun* foo (a &optional b &key c d (e 17)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 defines a function which may be called with one, two, or more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 arguments. The first two arguments are bound to @code{a} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 @code{b} in the usual way. The remaining arguments must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 pairs of the form @code{:c}, @code{:d}, or @code{:e} followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 by the value to be bound to the corresponding argument variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (Symbols whose names begin with a colon are called @dfn{keywords},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 and they are self-quoting in the same way as @code{nil} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 @code{t}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 For example, the call @code{(foo 1 2 :d 3 :c 4)} sets the five
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 arguments to 1, 2, 4, 3, and 17, respectively. If the same keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 appears more than once in the function call, the first occurrence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 takes precedence over the later ones. Note that it is not possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 to specify keyword arguments without specifying the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 argument @code{b} as well, since @code{(foo 1 :c 2)} would bind
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 @code{b} to the keyword @code{:c}, then signal an error because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 @code{2} is not a valid keyword.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 If a @var{keyword} symbol is explicitly specified in the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 list as shown in the above diagram, then that keyword will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 used instead of just the variable name prefixed with a colon.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 You can specify a @var{keyword} symbol which does not begin with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 a colon at all, but such symbols will not be self-quoting; you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 will have to quote them explicitly with an apostrophe in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 function call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 Ordinarily it is an error to pass an unrecognized keyword to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 a function, e.g., @code{(foo 1 2 :c 3 :goober 4)}. You can ask
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 Lisp to ignore unrecognized keywords, either by adding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 marker @code{&allow-other-keys} after the keyword section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 of the argument list, or by specifying an @code{:allow-other-keys}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 argument in the call whose value is non-@code{nil}. If the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 function uses both @code{&rest} and @code{&key} at the same time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 the ``rest'' argument is bound to the keyword list as it appears
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 in the call. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (defun* find-thing (thing &rest rest &key need &allow-other-keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (or (apply 'member* thing thing-list :allow-other-keys t rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (if need (error "Thing not found"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 This function takes a @code{:need} keyword argument, but also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 accepts other keyword arguments which are passed on to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 @code{member*} function. @code{allow-other-keys} is used to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 keep both @code{find-thing} and @code{member*} from complaining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 about each others' keywords in the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 As a (significant) performance optimization, this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 implements the scan for keyword arguments by calling @code{memq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 to search for keywords in a ``rest'' argument. Technically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 speaking, this is incorrect, since @code{memq} looks at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 odd-numbered values as well as the even-numbered keywords.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 The net effect is that if you happen to pass a keyword symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 as the @emph{value} of another keyword argument, where that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 keyword symbol happens to equal the name of a valid keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 argument of the same function, then the keyword parser will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 become confused. This minor bug can only affect you if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 use keyword symbols as general-purpose data in your program;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 this practice is strongly discouraged in Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 The fifth section of the argument list consists of @dfn{auxiliary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 variables}. These are not really arguments at all, but simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 variables which are bound to @code{nil} or to the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 @var{initforms} during execution of the function. There is no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 difference between the following two functions, except for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 matter of stylistic taste:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (defun* foo (a b &aux (c (+ a b)) d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 @var{body})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (defun* foo (a b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (let ((c (+ a b)) d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 @var{body}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 Argument lists support @dfn{destructuring}. In Common Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 destructuring is only allowed with @code{defmacro}; this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 allows it with @code{defun*} and other argument lists as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 In destructuring, any argument variable (@var{var} in the above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 diagram) can be replaced by a list of variables, or more generally,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 a recursive argument list. The corresponding argument value must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 be a list whose elements match this recursive argument list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (defmacro* dolist ((var listform &optional resultform)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 &rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 This says that the first argument of @code{dolist} must be a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 of two or three items; if there are other arguments as well as this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 list, they are stored in @code{body}. All features allowed in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 regular argument lists are allowed in these recursive argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 In addition, the clause @samp{&whole @var{var}} is allowed at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 front of a recursive argument list. It binds @var{var} to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 whole list being matched; thus @code{(&whole all a b)} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 a list of two things, with @code{a} bound to the first thing,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 @code{b} bound to the second thing, and @code{all} bound to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 list itself. (Common Lisp allows @code{&whole} in top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 @code{defmacro} argument lists as well, but Emacs Lisp does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 support this usage.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 One last feature of destructuring is that the argument list may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 dotted, so that the argument list @code{(a b . c)} is functionally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 equivalent to @code{(a b &rest c)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 If the optimization quality @code{safety} is set to 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (@pxref{Declarations}), error checking for wrong number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 arguments and invalid keyword arguments is disabled. By default,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 argument lists are rigorously checked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 @node Time of Evaluation, Function Aliases, Argument Lists, Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 @section Time of Evaluation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 Normally, the byte-compiler does not actually execute the forms in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 a file it compiles. For example, if a file contains @code{(setq foo t)},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 the act of compiling it will not actually set @code{foo} to @code{t}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 This is true even if the @code{setq} was a top-level form (i.e., not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 enclosed in a @code{defun} or other form). Sometimes, though, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 would like to have certain top-level forms evaluated at compile-time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 For example, the compiler effectively evaluates @code{defmacro} forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 at compile-time so that later parts of the file can refer to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 macros that are defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 @defspec eval-when (situations...) forms...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 This form controls when the body @var{forms} are evaluated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 The @var{situations} list may contain any set of the symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 @code{compile}, @code{load}, and @code{eval} (or their long-winded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 ANSI equivalents, @code{:compile-toplevel}, @code{:load-toplevel},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 and @code{:execute}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 The @code{eval-when} form is handled differently depending on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 whether or not it is being compiled as a top-level form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 Specifically, it gets special treatment if it is being compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 by a command such as @code{byte-compile-file} which compiles files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 or buffers of code, and it appears either literally at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 top level of the file or inside a top-level @code{progn}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 For compiled top-level @code{eval-when}s, the body @var{forms} are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 executed at compile-time if @code{compile} is in the @var{situations}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 list, and the @var{forms} are written out to the file (to be executed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 at load-time) if @code{load} is in the @var{situations} list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 For non-compiled-top-level forms, only the @code{eval} situation is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 relevant. (This includes forms executed by the interpreter, forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 compiled with @code{byte-compile} rather than @code{byte-compile-file},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 and non-top-level forms.) The @code{eval-when} acts like a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 @code{progn} if @code{eval} is specified, and like @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (ignoring the body @var{forms}) if not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 The rules become more subtle when @code{eval-when}s are nested;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 consult Steele (second edition) for the gruesome details (and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 some gruesome examples).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 Some simple examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 ;; Top-level forms in foo.el:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 (eval-when (compile) (setq foo1 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (eval-when (load) (setq foo2 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 (eval-when (compile load) (setq foo3 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 (eval-when (eval) (setq foo4 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 (eval-when (eval compile) (setq foo5 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (eval-when (eval load) (setq foo6 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 (eval-when (eval compile load) (setq foo7 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 When @file{foo.el} is compiled, these variables will be set during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 the compilation itself:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 foo1 foo3 foo5 foo7 ; `compile'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 When @file{foo.elc} is loaded, these variables will be set:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 foo2 foo3 foo6 foo7 ; `load'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 And if @file{foo.el} is loaded uncompiled, these variables will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 be set:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 foo4 foo5 foo6 foo7 ; `eval'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 If these seven @code{eval-when}s had been, say, inside a @code{defun},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 then the first three would have been equivalent to @code{nil} and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 last four would have been equivalent to the corresponding @code{setq}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 Note that @code{(eval-when (load eval) @dots{})} is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 to @code{(progn @dots{})} in all contexts. The compiler treats
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 certain top-level forms, like @code{defmacro} (sort-of) and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 @code{require}, as if they were wrapped in @code{(eval-when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 (compile load eval) @dots{})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 Emacs 19 includes two special forms related to @code{eval-when}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 One of these, @code{eval-when-compile}, is not quite equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 any @code{eval-when} construct and is described below. This package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 defines a version of @code{eval-when-compile} for the benefit of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 Emacs 18 users.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 The other form, @code{(eval-and-compile @dots{})}, is exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 equivalent to @samp{(eval-when (compile load eval) @dots{})} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 so is not itself defined by this package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 @defspec eval-when-compile forms...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 The @var{forms} are evaluated at compile-time; at execution time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 this form acts like a quoted constant of the resulting value. Used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 at top-level, @code{eval-when-compile} is just like @samp{eval-when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 (compile eval)}. In other contexts, @code{eval-when-compile}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 allows code to be evaluated once at compile-time for efficiency
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 or other reasons.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 This form is similar to the @samp{#.} syntax of true Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 @defspec load-time-value form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 The @var{form} is evaluated at load-time; at execution time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 this form acts like a quoted constant of the resulting value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 Early Common Lisp had a @samp{#,} syntax that was similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 this, but ANSI Common Lisp replaced it with @code{load-time-value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 and gave it more well-defined semantics.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 In a compiled file, @code{load-time-value} arranges for @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 to be evaluated when the @file{.elc} file is loaded and then used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 as if it were a quoted constant. In code compiled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 @code{byte-compile} rather than @code{byte-compile-file}, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 effect is identical to @code{eval-when-compile}. In uncompiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 code, both @code{eval-when-compile} and @code{load-time-value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 act exactly like @code{progn}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 (defun report ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 (insert "This function was executed on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 (current-time-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 ", compiled on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (eval-when-compile (current-time-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 ;; or '#.(current-time-string) in real Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 ", and loaded on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 (load-time-value (current-time-string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 Byte-compiled, the above defun will result in the following code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 (or its compiled equivalent, of course) in the @file{.elc} file:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (setq --temp-- (current-time-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (defun report ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 (insert "This function was executed on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 (current-time-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 ", compiled on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 '"Wed Jun 23 18:33:43 1993"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 ", and loaded on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 --temp--))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 @node Function Aliases, , Time of Evaluation, Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 @section Function Aliases
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 This section describes a feature from GNU Emacs 19 which this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 package makes available in other versions of Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 @defun defalias symbol function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 This function sets @var{symbol}'s function cell to @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 It is equivalent to @code{fset}, except that in GNU Emacs 19 it also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 records the setting in @code{load-history} so that it can be undone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 by a later @code{unload-feature}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 In other versions of Emacs, @code{defalias} is a synonym for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 @code{fset}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 @node Predicates, Control Structure, Program Structure, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 @chapter Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 This section describes functions for testing whether various
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 facts are true or false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 * Type Predicates:: `typep', `deftype', and `coerce'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 * Equality Predicates:: `eql' and `equalp'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @node Type Predicates, Equality Predicates, Predicates, Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 @section Type Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 The @dfn{CL} package defines a version of the Common Lisp @code{typep}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 @defun typep object type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 Check if @var{object} is of type @var{type}, where @var{type} is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (quoted) type name of the sort used by Common Lisp. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 @code{(typep foo 'integer)} is equivalent to @code{(integerp foo)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 The @var{type} argument to the above function is either a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 or a list beginning with a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 If the type name is a symbol, Emacs appends @samp{-p} to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 symbol name to form the name of a predicate function for testing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 the type. (Built-in predicates whose names end in @samp{p} rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 than @samp{-p} are used when appropriate.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 The type symbol @code{t} stands for the union of all types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 @code{(typep @var{object} t)} is always true. Likewise, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 type symbol @code{nil} stands for nothing at all, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 @code{(typep @var{object} nil)} is always false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 The type symbol @code{null} represents the symbol @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 Thus @code{(typep @var{object} 'null)} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 @code{(null @var{object})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 The type symbol @code{real} is a synonym for @code{number}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 @code{fixnum} is a synonym for @code{integer}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 The type symbols @code{character} and @code{string-char} match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 characters. In Emacs-19 and XEmacs-19, characters are the same thing as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 integers in the range 0-255. In XEmacs-20, where characters are a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 first-class data type, this checks for actual characters, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 @code{(typep @var{8bit-integer} 'character)} will return @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 The type symbol @code{float} uses the @code{floatp-safe} predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 defined by this package rather than @code{floatp}, so it will work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 correctly even in Emacs versions without floating-point support.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 The type list @code{(integer @var{low} @var{high})} represents all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 integers between @var{low} and @var{high}, inclusive. Either bound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 may be a list of a single integer to specify an exclusive limit,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 or a @code{*} to specify no limit. The type @code{(integer * *)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 is thus equivalent to @code{integer}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 Likewise, lists beginning with @code{float}, @code{real}, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 @code{number} represent numbers of that type falling in a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 range.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 Lists beginning with @code{and}, @code{or}, and @code{not} form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 combinations of types. For example, @code{(or integer (float 0 *))}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 represents all objects that are integers or non-negative floats.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 Lists beginning with @code{member} or @code{member*} represent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 objects @code{eql} to any of the following values. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 @code{(member 1 2 3 4)} is equivalent to @code{(integer 1 4)},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 and @code{(member nil)} is equivalent to @code{null}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 Lists of the form @code{(satisfies @var{predicate})} represent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 all objects for which @var{predicate} returns true when called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 with that object as an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 The following function and macro (not technically predicates) are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 related to @code{typep}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 @defun coerce object type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 This function attempts to convert @var{object} to the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 @var{type}. If @var{object} is already of that type as determined by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 @code{typep}, it is simply returned. Otherwise, certain types of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 conversions will be made: If @var{type} is any sequence type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 (@code{string}, @code{list}, etc.) then @var{object} will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 converted to that type if possible. If @var{type} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 @code{character}, then strings of length one and symbols with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 one-character names can be coerced. If @var{type} is @code{float},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 then integers can be coerced in versions of Emacs that support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 floats. In all other circumstances, @code{coerce} signals an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 @defspec deftype name arglist forms...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 This macro defines a new type called @var{name}. It is similar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 to @code{defmacro} in many ways; when @var{name} is encountered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 as a type name, the body @var{forms} are evaluated and should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 return a type specifier that is equivalent to the type. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 @var{arglist} is a Common Lisp argument list of the sort accepted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 by @code{defmacro*}. The type specifier @samp{(@var{name} @var{args}...)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 is expanded by calling the expander with those arguments; the type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 symbol @samp{@var{name}} is expanded by calling the expander with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 no arguments. The @var{arglist} is processed the same as for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 @code{defmacro*} except that optional arguments without explicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 defaults use @code{*} instead of @code{nil} as the ``default''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 default. Some examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 (deftype null () '(satisfies null)) ; predefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 (deftype list () '(or null cons)) ; predefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 (deftype unsigned-byte (&optional bits)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 (list 'integer 0 (if (eq bits '*) bits (1- (lsh 1 bits)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (unsigned-byte 8) @equiv{} (integer 0 255)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 (unsigned-byte) @equiv{} (integer 0 *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 unsigned-byte @equiv{} (integer 0 *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 The last example shows how the Common Lisp @code{unsigned-byte}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 type specifier could be implemented if desired; this package does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 not implement @code{unsigned-byte} by default.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 The @code{typecase} and @code{check-type} macros also use type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 names. @xref{Conditionals}. @xref{Assertions}. The @code{map},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 @code{concatenate}, and @code{merge} functions take type-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 arguments to specify the type of sequence to return. @xref{Sequences}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 @node Equality Predicates, , Type Predicates, Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 @section Equality Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 This package defines two Common Lisp predicates, @code{eql} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 @code{equalp}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 @defun eql a b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 This function is almost the same as @code{eq}, except that if @var{a}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 and @var{b} are numbers of the same type, it compares them for numeric
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 equality (as if by @code{equal} instead of @code{eq}). This makes a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 difference only for versions of Emacs that are compiled with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 floating-point support, such as Emacs 19. Emacs floats are allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 objects just like cons cells, which means that @code{(eq 3.0 3.0)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 will not necessarily be true---if the two @code{3.0}s were allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 separately, the pointers will be different even though the numbers are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 the same. But @code{(eql 3.0 3.0)} will always be true.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 The types of the arguments must match, so @code{(eql 3 3.0)} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 still false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 Note that Emacs integers are ``direct'' rather than allocated, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 basically means @code{(eq 3 3)} will always be true. Thus @code{eq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 and @code{eql} behave differently only if floating-point numbers are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 involved, and are indistinguishable on Emacs versions that don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 support floats.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 There is a slight inconsistency with Common Lisp in the treatment of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 positive and negative zeros. Some machines, notably those with IEEE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 standard arithmetic, represent @code{+0} and @code{-0} as distinct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 values. Normally this doesn't matter because the standard specifies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 that @code{(= 0.0 -0.0)} should always be true, and this is indeed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 what Emacs Lisp and Common Lisp do. But the Common Lisp standard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 states that @code{(eql 0.0 -0.0)} and @code{(equal 0.0 -0.0)} should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 be false on IEEE-like machines; Emacs Lisp does not do this, and in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 fact the only known way to distinguish between the two zeros in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 Lisp is to @code{format} them and check for a minus sign.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 @defun equalp a b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 This function is a more flexible version of @code{equal}. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 particular, it compares strings and characters case-insensitively, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 it compares numbers without regard to type (so that @code{(equalp 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 3.0)} is true). Vectors and conses are compared recursively. All other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 objects are compared as if by @code{equal}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 This function differs from Common Lisp @code{equalp} in several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 respects. In keeping with the idea that strings are less
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 vector-like in Emacs Lisp, this package's @code{equalp} also will not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 compare strings against vectors of integers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 Also note that the Common Lisp functions @code{member} and @code{assoc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 use @code{eql} to compare elements, whereas Emacs Lisp follows the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 MacLisp tradition and uses @code{equal} for these two functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 In Emacs, use @code{member*} and @code{assoc*} to get functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 which use @code{eql} for comparisons.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 @node Control Structure, Macros, Predicates, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 @chapter Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 The features described in the following sections implement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 various advanced control structures, including the powerful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 @code{setf} facility and a number of looping and conditional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 constructs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 * Assignment:: The `psetq' form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 * Generalized Variables:: `setf', `incf', `push', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 * Variable Bindings:: `progv', `lexical-let', `flet', `macrolet'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 * Conditionals:: `when', `unless', `case', `typecase'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 * Blocks and Exits:: `block', `return', `return-from'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 * Iteration:: `do', `dotimes', `dolist', `do-symbols'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 * Loop Facility:: The Common Lisp `loop' macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 * Multiple Values:: `values', `multiple-value-bind', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 @node Assignment, Generalized Variables, Control Structure, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 @section Assignment
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 The @code{psetq} form is just like @code{setq}, except that multiple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 assignments are done in parallel rather than sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 @defspec psetq [symbol form]@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 This special form (actually a macro) is used to assign to several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 variables simultaneously. Given only one @var{symbol} and @var{form},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 it has the same effect as @code{setq}. Given several @var{symbol}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 and @var{form} pairs, it evaluates all the @var{form}s in advance
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 and then stores the corresponding variables afterwards.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 (setq x 2 y 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 (setq x (+ x y) y (* x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 y ; @r{@code{y} was computed after @code{x} was set.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 @result{} 15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 (setq x 2 y 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (psetq x (+ x y) y (* x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 y ; @r{@code{y} was computed before @code{x} was set.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 @result{} 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 The simplest use of @code{psetq} is @code{(psetq x y y x)}, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 exchanges the values of two variables. (The @code{rotatef} form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 provides an even more convenient way to swap two variables;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 @pxref{Modify Macros}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 @code{psetq} always returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 @node Generalized Variables, Variable Bindings, Assignment, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 @section Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 A ``generalized variable'' or ``place form'' is one of the many places
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 in Lisp memory where values can be stored. The simplest place form is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 a regular Lisp variable. But the cars and cdrs of lists, elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 of arrays, properties of symbols, and many other locations are also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 places where Lisp values are stored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 The @code{setf} form is like @code{setq}, except that it accepts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 arbitrary place forms on the left side rather than just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 symbols. For example, @code{(setf (car a) b)} sets the car of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 @code{a} to @code{b}, doing the same operation as @code{(setcar a b)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 but without having to remember two separate functions for setting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 and accessing every type of place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 Generalized variables are analogous to ``lvalues'' in the C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 language, where @samp{x = a[i]} gets an element from an array
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 and @samp{a[i] = x} stores an element using the same notation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 Just as certain forms like @code{a[i]} can be lvalues in C, there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 is a set of forms that can be generalized variables in Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 * Basic Setf:: `setf' and place forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 * Modify Macros:: `incf', `push', `rotatef', `letf', `callf', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 * Customizing Setf:: `define-modify-macro', `defsetf', `define-setf-method'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 @node Basic Setf, Modify Macros, Generalized Variables, Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 @subsection Basic Setf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 The @code{setf} macro is the most basic way to operate on generalized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 @defspec setf [place form]@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 This macro evaluates @var{form} and stores it in @var{place}, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 must be a valid generalized variable form. If there are several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 @var{place} and @var{form} pairs, the assignments are done sequentially
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 just as with @code{setq}. @code{setf} returns the value of the last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 The following Lisp forms will work as generalized variables, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 so may legally appear in the @var{place} argument of @code{setf}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 A symbol naming a variable. In other words, @code{(setf x y)} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 exactly equivalent to @code{(setq x y)}, and @code{setq} itself is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 strictly speaking redundant now that @code{setf} exists. Many
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 programmers continue to prefer @code{setq} for setting simple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 variables, though, purely for stylistic or historical reasons.
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1076 The form @code{(setf x y)} actually expands to @code{(setq x y)},
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 so there is no performance penalty for using it in compiled code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 A call to any of the following Lisp functions:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 car cdr caar .. cddddr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 nth rest first .. tenth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 aref elt nthcdr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 symbol-function symbol-value symbol-plist
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1087 get getf gethash
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1088 subseq
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 Note that for @code{nthcdr} and @code{getf}, the list argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 of the function must itself be a valid @var{place} form. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 example, @code{(setf (nthcdr 0 foo) 7)} will set @code{foo} itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 to 7. Note that @code{push} and @code{pop} on an @code{nthcdr}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 place can be used to insert or delete at any position in a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 The use of @code{nthcdr} as a @var{place} form is an extension
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 to standard Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 The following Emacs-specific functions are also @code{setf}-able.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 (Some of these are defined only in Emacs 19 or only in XEmacs.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 buffer-file-name marker-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 buffer-modified-p match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 buffer-name mouse-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 buffer-string overlay-end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 buffer-substring overlay-get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 current-buffer overlay-start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 current-case-table point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 current-column point-marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 current-global-map point-max
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 current-input-mode point-min
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 current-local-map process-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 current-window-configuration process-filter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 default-file-modes process-sentinel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 default-value read-mouse-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 documentation-property screen-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 extent-data screen-menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 extent-end-position screen-width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 extent-start-position selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 face-background selected-screen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 face-background-pixmap selected-frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 face-font standard-case-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 face-foreground syntax-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 face-underline-p window-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 file-modes window-dedicated-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 frame-height window-display-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 frame-parameters window-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 frame-visible-p window-hscroll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 frame-width window-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 get-register window-start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 getenv window-width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 global-key-binding x-get-cut-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 keymap-parent x-get-cutbuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 local-key-binding x-get-secondary-selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 mark x-get-selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 mark-marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 Most of these have directly corresponding ``set'' functions, like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 @code{use-local-map} for @code{current-local-map}, or @code{goto-char}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 for @code{point}. A few, like @code{point-min}, expand to longer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 sequences of code when they are @code{setf}'d (@code{(narrow-to-region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 x (point-max))} in this case).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 A call of the form @code{(substring @var{subplace} @var{n} [@var{m}])},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 where @var{subplace} is itself a legal generalized variable whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 current value is a string, and where the value stored is also a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 string. The new string is spliced into the specified part of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 destination string. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 (setq a (list "hello" "world"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 @result{} ("hello" "world")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 (cadr a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 @result{} "world"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 (substring (cadr a) 2 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 @result{} "rl"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 (setf (substring (cadr a) 2 4) "o")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 @result{} "o"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 (cadr a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 @result{} "wood"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 @result{} ("hello" "wood")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 The generalized variable @code{buffer-substring}, listed above,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 also works in this way by replacing a portion of the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 A call of the form @code{(apply '@var{func} @dots{})} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 @code{(apply (function @var{func}) @dots{})}, where @var{func}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 is a @code{setf}-able function whose store function is ``suitable''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 in the sense described in Steele's book; since none of the standard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 Emacs place functions are suitable in this sense, this feature is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 only interesting when used with places you define yourself with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 @code{define-setf-method} or the long form of @code{defsetf}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 A macro call, in which case the macro is expanded and @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 is applied to the resulting form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 Any form for which a @code{defsetf} or @code{define-setf-method}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 has been made.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 Using any forms other than these in the @var{place} argument to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 @code{setf} will signal an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 The @code{setf} macro takes care to evaluate all subforms in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 the proper left-to-right order; for example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 (setf (aref vec (incf i)) i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 looks like it will evaluate @code{(incf i)} exactly once, before the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 following access to @code{i}; the @code{setf} expander will insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 temporary variables as necessary to ensure that it does in fact work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 this way no matter what setf-method is defined for @code{aref}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 (In this case, @code{aset} would be used and no such steps would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 be necessary since @code{aset} takes its arguments in a convenient
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 order.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 However, if the @var{place} form is a macro which explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 evaluates its arguments in an unusual order, this unusual order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 will be preserved. Adapting an example from Steele, given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 (defmacro wrong-order (x y) (list 'aref y x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 the form @code{(setf (wrong-order @var{a} @var{b}) 17)} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 evaluate @var{b} first, then @var{a}, just as in an actual call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 to @code{wrong-order}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 @node Modify Macros, Customizing Setf, Basic Setf, Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 @subsection Modify Macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 This package defines a number of other macros besides @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 that operate on generalized variables. Many are interesting and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 useful even when the @var{place} is just a variable name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 @defspec psetf [place form]@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 This macro is to @code{setf} what @code{psetq} is to @code{setq}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 When several @var{place}s and @var{form}s are involved, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 assignments take place in parallel rather than sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 Specifically, all subforms are evaluated from left to right, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 all the assignments are done (in an undefined order).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 @defspec incf place &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 This macro increments the number stored in @var{place} by one, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 by @var{x} if specified. The incremented value is returned. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 example, @code{(incf i)} is equivalent to @code{(setq i (1+ i))}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 @code{(incf (car x) 2)} is equivalent to @code{(setcar x (+ (car x) 2))}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 Once again, care is taken to preserve the ``apparent'' order of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 evaluation. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 (incf (aref vec (incf i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 appears to increment @code{i} once, then increment the element of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 @code{vec} addressed by @code{i}; this is indeed exactly what it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 does, which means the above form is @emph{not} equivalent to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 ``obvious'' expansion,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 (setf (aref vec (incf i)) (1+ (aref vec (incf i)))) ; Wrong!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 but rather to something more like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 (let ((temp (incf i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 (setf (aref vec temp) (1+ (aref vec temp))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 Again, all of this is taken care of automatically by @code{incf} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 the other generalized-variable macros.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 As a more Emacs-specific example of @code{incf}, the expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 @code{(incf (point) @var{n})} is essentially equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 @code{(forward-char @var{n})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 @defspec decf place &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 This macro decrements the number stored in @var{place} by one, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 by @var{x} if specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 @defspec pop place
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 This macro removes and returns the first element of the list stored
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 in @var{place}. It is analogous to @code{(prog1 (car @var{place})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 (setf @var{place} (cdr @var{place})))}, except that it takes care
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 to evaluate all subforms only once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 @defspec push x place
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 This macro inserts @var{x} at the front of the list stored in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 @var{place}. It is analogous to @code{(setf @var{place} (cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 @var{x} @var{place}))}, except for evaluation of the subforms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 @defspec pushnew x place @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 This macro inserts @var{x} at the front of the list stored in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 @var{place}, but only if @var{x} was not @code{eql} to any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 existing element of the list. The optional keyword arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 are interpreted in the same way as for @code{adjoin}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 @xref{Lists as Sets}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 @defspec shiftf place@dots{} newvalue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 This macro shifts the @var{place}s left by one, shifting in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 value of @var{newvalue} (which may be any Lisp expression, not just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 a generalized variable), and returning the value shifted out of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 the first @var{place}. Thus, @code{(shiftf @var{a} @var{b} @var{c}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 @var{d})} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 (prog1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 @var{a}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 (psetf @var{a} @var{b}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 @var{b} @var{c}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 @var{c} @var{d}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 except that the subforms of @var{a}, @var{b}, and @var{c} are actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 evaluated only once each and in the apparent order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 @defspec rotatef place@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 This macro rotates the @var{place}s left by one in circular fashion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 Thus, @code{(rotatef @var{a} @var{b} @var{c} @var{d})} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 (psetf @var{a} @var{b}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 @var{b} @var{c}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 @var{c} @var{d}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 @var{d} @var{a})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 except for the evaluation of subforms. @code{rotatef} always
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 returns @code{nil}. Note that @code{(rotatef @var{a} @var{b})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 conveniently exchanges @var{a} and @var{b}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 The following macros were invented for this package; they have no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 analogues in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 @defspec letf (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 This macro is analogous to @code{let}, but for generalized variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 rather than just symbols. Each @var{binding} should be of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 @code{(@var{place} @var{value})}; the original contents of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 @var{place}s are saved, the @var{value}s are stored in them, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 then the body @var{form}s are executed. Afterwards, the @var{places}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 are set back to their original saved contents. This cleanup happens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 even if the @var{form}s exit irregularly due to a @code{throw} or an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 (letf (((point) (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 (a 17))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 moves ``point'' in the current buffer to the beginning of the buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 and also binds @code{a} to 17 (as if by a normal @code{let}, since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 @code{a} is just a regular variable). After the body exits, @code{a}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 is set back to its original value and point is moved back to its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 original position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 Note that @code{letf} on @code{(point)} is not quite like a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 @code{save-excursion}, as the latter effectively saves a marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 which tracks insertions and deletions in the buffer. Actually,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 a @code{letf} of @code{(point-marker)} is much closer to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 behavior. (@code{point} and @code{point-marker} are equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 as @code{setf} places; each will accept either an integer or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 marker as the stored value.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 Since generalized variables look like lists, @code{let}'s shorthand
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 of using @samp{foo} for @samp{(foo nil)} as a @var{binding} would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 be ambiguous in @code{letf} and is not allowed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 However, a @var{binding} specifier may be a one-element list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 @samp{(@var{place})}, which is similar to @samp{(@var{place}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 @var{place})}. In other words, the @var{place} is not disturbed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 on entry to the body, and the only effect of the @code{letf} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 to restore the original value of @var{place} afterwards. (The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 redundant access-and-store suggested by the @code{(@var{place}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 @var{place})} example does not actually occur.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 In most cases, the @var{place} must have a well-defined value on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 entry to the @code{letf} form. The only exceptions are plain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 variables and calls to @code{symbol-value} and @code{symbol-function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 If the symbol is not bound on entry, it is simply made unbound by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 @code{makunbound} or @code{fmakunbound} on exit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 @defspec letf* (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 This macro is to @code{letf} what @code{let*} is to @code{let}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 It does the bindings in sequential rather than parallel order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 @defspec callf @var{function} @var{place} @var{args}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 This is the ``generic'' modify macro. It calls @var{function},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 which should be an unquoted function name, macro name, or lambda.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 It passes @var{place} and @var{args} as arguments, and assigns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 result back to @var{place}. For example, @code{(incf @var{place}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 @var{n})} is the same as @code{(callf + @var{place} @var{n})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 Some more examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 (callf abs my-number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 (callf concat (buffer-name) "<" (int-to-string n) ">")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 (callf union happy-people (list joe bob) :test 'same-person)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 @xref{Customizing Setf}, for @code{define-modify-macro}, a way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 to create even more concise notations for modify macros. Note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 again that @code{callf} is an extension to standard Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 @defspec callf2 @var{function} @var{arg1} @var{place} @var{args}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 This macro is like @code{callf}, except that @var{place} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 the @emph{second} argument of @var{function} rather than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 first. For example, @code{(push @var{x} @var{place})} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 equivalent to @code{(callf2 cons @var{x} @var{place})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 The @code{callf} and @code{callf2} macros serve as building
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 blocks for other macros like @code{incf}, @code{pushnew}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 @code{define-modify-macro}. The @code{letf} and @code{letf*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 macros are used in the processing of symbol macros;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 @pxref{Macro Bindings}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 @node Customizing Setf, , Modify Macros, Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 @subsection Customizing Setf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 Common Lisp defines three macros, @code{define-modify-macro},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 @code{defsetf}, and @code{define-setf-method}, that allow the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 user to extend generalized variables in various ways.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 @defspec define-modify-macro name arglist function [doc-string]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 This macro defines a ``read-modify-write'' macro similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 @code{incf} and @code{decf}. The macro @var{name} is defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 to take a @var{place} argument followed by additional arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 described by @var{arglist}. The call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 (@var{name} @var{place} @var{args}...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 will be expanded to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 (callf @var{func} @var{place} @var{args}...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 which in turn is roughly equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 (setf @var{place} (@var{func} @var{place} @var{args}...))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 (define-modify-macro incf (&optional (n 1)) +)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 (define-modify-macro concatf (&rest args) concat)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 Note that @code{&key} is not allowed in @var{arglist}, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 @code{&rest} is sufficient to pass keywords on to the function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 Most of the modify macros defined by Common Lisp do not exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 follow the pattern of @code{define-modify-macro}. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 @code{push} takes its arguments in the wrong order, and @code{pop}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 is completely irregular. You can define these macros ``by hand''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 using @code{get-setf-method}, or consult the source file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 @file{cl-macs.el} to see how to use the internal @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 building blocks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 @defspec defsetf access-fn update-fn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 This is the simpler of two @code{defsetf} forms. Where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 @var{access-fn} is the name of a function which accesses a place,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 this declares @var{update-fn} to be the corresponding store
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 function. From now on,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 (setf (@var{access-fn} @var{arg1} @var{arg2} @var{arg3}) @var{value})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 will be expanded to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 (@var{update-fn} @var{arg1} @var{arg2} @var{arg3} @var{value})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 The @var{update-fn} is required to be either a true function, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 a macro which evaluates its arguments in a function-like way. Also,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 the @var{update-fn} is expected to return @var{value} as its result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 Otherwise, the above expansion would not obey the rules for the way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 @code{setf} is supposed to behave.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 As a special (non-Common-Lisp) extension, a third argument of @code{t}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 to @code{defsetf} says that the @code{update-fn}'s return value is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 not suitable, so that the above @code{setf} should be expanded to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 something more like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 (let ((temp @var{value}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 (@var{update-fn} @var{arg1} @var{arg2} @var{arg3} temp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 temp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 Some examples of the use of @code{defsetf}, drawn from the standard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 suite of setf methods, are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 (defsetf car setcar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 (defsetf symbol-value set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 (defsetf buffer-name rename-buffer t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 @defspec defsetf access-fn arglist (store-var) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 This is the second, more complex, form of @code{defsetf}. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 rather like @code{defmacro} except for the additional @var{store-var}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 argument. The @var{forms} should return a Lisp form which stores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 the value of @var{store-var} into the generalized variable formed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 by a call to @var{access-fn} with arguments described by @var{arglist}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 The @var{forms} may begin with a string which documents the @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 method (analogous to the doc string that appears at the front of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 function).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 For example, the simple form of @code{defsetf} is shorthand for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 (defsetf @var{access-fn} (&rest args) (store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 (append '(@var{update-fn}) args (list store)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 The Lisp form that is returned can access the arguments from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 @var{arglist} and @var{store-var} in an unrestricted fashion;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 macros like @code{setf} and @code{incf} which invoke this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 setf-method will insert temporary variables as needed to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 sure the apparent order of evaluation is preserved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 Another example drawn from the standard package:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 (defsetf nth (n x) (store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 (list 'setcar (list 'nthcdr n x) store))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 @defspec define-setf-method access-fn arglist forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 This is the most general way to create new place forms. When
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 a @code{setf} to @var{access-fn} with arguments described by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 @var{arglist} is expanded, the @var{forms} are evaluated and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 must return a list of five items:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 @enumerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 A list of @dfn{temporary variables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 A list of @dfn{value forms} corresponding to the temporary variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 above. The temporary variables will be bound to these value forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 as the first step of any operation on the generalized variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 A list of exactly one @dfn{store variable} (generally obtained
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 from a call to @code{gensym}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 A Lisp form which stores the contents of the store variable into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 the generalized variable, assuming the temporaries have been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 bound as described above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 A Lisp form which accesses the contents of the generalized variable,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 assuming the temporaries have been bound.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 @end enumerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 This is exactly like the Common Lisp macro of the same name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 except that the method returns a list of five values rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 than the five values themselves, since Emacs Lisp does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 support Common Lisp's notion of multiple return values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 Once again, the @var{forms} may begin with a documentation string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 A setf-method should be maximally conservative with regard to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 temporary variables. In the setf-methods generated by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 @code{defsetf}, the second return value is simply the list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 arguments in the place form, and the first return value is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 list of a corresponding number of temporary variables generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 by @code{gensym}. Macros like @code{setf} and @code{incf} which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 use this setf-method will optimize away most temporaries that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 turn out to be unnecessary, so there is little reason for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 setf-method itself to optimize.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 @defun get-setf-method place &optional env
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 This function returns the setf-method for @var{place}, by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 invoking the definition previously recorded by @code{defsetf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 or @code{define-setf-method}. The result is a list of five
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 values as described above. You can use this function to build
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 your own @code{incf}-like modify macros. (Actually, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 better to use the internal functions @code{cl-setf-do-modify}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 and @code{cl-setf-do-store}, which are a bit easier to use and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 which also do a number of optimizations; consult the source
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 code for the @code{incf} function for a simple example.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 The argument @var{env} specifies the ``environment'' to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 passed on to @code{macroexpand} if @code{get-setf-method} should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 need to expand a macro in @var{place}. It should come from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 an @code{&environment} argument to the macro or setf-method
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 that called @code{get-setf-method}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 See also the source code for the setf-methods for @code{apply}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 and @code{substring}, each of which works by calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 @code{get-setf-method} on a simpler case, then massaging
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 the result in various ways.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 Modern Common Lisp defines a second, independent way to specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 the @code{setf} behavior of a function, namely ``@code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 functions'' whose names are lists @code{(setf @var{name})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 rather than symbols. For example, @code{(defun (setf foo) @dots{})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 defines the function that is used when @code{setf} is applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 @code{foo}. This package does not currently support @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 functions. In particular, it is a compile-time error to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 @code{setf} on a form which has not already been @code{defsetf}'d
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 or otherwise declared; in newer Common Lisps, this would not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 an error since the function @code{(setf @var{func})} might be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 defined later.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 @secno=4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 @node Variable Bindings, Conditionals, Generalized Variables, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 @section Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 These Lisp forms make bindings to variables and function names,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 analogous to Lisp's built-in @code{let} form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 @xref{Modify Macros}, for the @code{letf} and @code{letf*} forms which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 are also related to variable bindings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 * Dynamic Bindings:: The `progv' form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 * Lexical Bindings:: `lexical-let' and lexical closures
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 * Function Bindings:: `flet' and `labels'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 * Macro Bindings:: `macrolet' and `symbol-macrolet'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 @node Dynamic Bindings, Lexical Bindings, Variable Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 @subsection Dynamic Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 The standard @code{let} form binds variables whose names are known
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 at compile-time. The @code{progv} form provides an easy way to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 bind variables whose names are computed at run-time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 @defspec progv symbols values forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 This form establishes @code{let}-style variable bindings on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 set of variables computed at run-time. The expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 @var{symbols} and @var{values} are evaluated, and must return lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 of symbols and values, respectively. The symbols are bound to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 corresponding values for the duration of the body @var{form}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 If @var{values} is shorter than @var{symbols}, the last few symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 are made unbound (as if by @code{makunbound}) inside the body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 If @var{symbols} is shorter than @var{values}, the excess values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 @node Lexical Bindings, Function Bindings, Dynamic Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 @subsection Lexical Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 The @dfn{CL} package defines the following macro which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 more closely follows the Common Lisp @code{let} form:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 @defspec lexical-let (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 This form is exactly like @code{let} except that the bindings it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 establishes are purely lexical. Lexical bindings are similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 local variables in a language like C: Only the code physically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 within the body of the @code{lexical-let} (after macro expansion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 may refer to the bound variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 (setq a 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 (defun foo (b) (+ a b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 (let ((a 2)) (foo a))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 (lexical-let ((a 2)) (foo a))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 @result{} 7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 In this example, a regular @code{let} binding of @code{a} actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 makes a temporary change to the global variable @code{a}, so @code{foo}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 is able to see the binding of @code{a} to 2. But @code{lexical-let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 actually creates a distinct local variable @code{a} for use within its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 body, without any effect on the global variable of the same name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 The most important use of lexical bindings is to create @dfn{closures}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 A closure is a function object that refers to an outside lexical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 variable. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 (defun make-adder (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 (lexical-let ((n n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 (function (lambda (m) (+ n m)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 (setq add17 (make-adder 17))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 (funcall add17 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 @result{} 21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 The call @code{(make-adder 17)} returns a function object which adds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 17 to its argument. If @code{let} had been used instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 @code{lexical-let}, the function object would have referred to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 global @code{n}, which would have been bound to 17 only during the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 call to @code{make-adder} itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 (defun make-counter ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 (lexical-let ((n 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 (function* (lambda (&optional (m 1)) (incf n m)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 (setq count-1 (make-counter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 (funcall count-1 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 (funcall count-1 14)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 @result{} 17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 (setq count-2 (make-counter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 (funcall count-2 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 (funcall count-1 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 @result{} 19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 (funcall count-2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 @result{} 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 Here we see that each call to @code{make-counter} creates a distinct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 local variable @code{n}, which serves as a private counter for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 function object that is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 Closed-over lexical variables persist until the last reference to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 them goes away, just like all other Lisp objects. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 @code{count-2} refers to a function object which refers to an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 instance of the variable @code{n}; this is the only reference
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 to that variable, so after @code{(setq count-2 nil)} the garbage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 collector would be able to delete this instance of @code{n}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 Of course, if a @code{lexical-let} does not actually create any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 closures, then the lexical variables are free as soon as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 @code{lexical-let} returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 Many closures are used only during the extent of the bindings they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 refer to; these are known as ``downward funargs'' in Lisp parlance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 When a closure is used in this way, regular Emacs Lisp dynamic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 bindings suffice and will be more efficient than @code{lexical-let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 closures:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 (defun add-to-list (x list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 (mapcar (function (lambda (y) (+ x y))) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 (add-to-list 7 '(1 2 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 @result{} (8 9 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 Since this lambda is only used while @code{x} is still bound,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 it is not necessary to make a true closure out of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 You can use @code{defun} or @code{flet} inside a @code{lexical-let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 to create a named closure. If several closures are created in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 body of a single @code{lexical-let}, they all close over the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 instance of the lexical variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 The @code{lexical-let} form is an extension to Common Lisp. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 true Common Lisp, all bindings are lexical unless declared otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 @defspec lexical-let* (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 This form is just like @code{lexical-let}, except that the bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 are made sequentially in the manner of @code{let*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 @node Function Bindings, Macro Bindings, Lexical Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 @subsection Function Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 These forms make @code{let}-like bindings to functions instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 of variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 @defspec flet (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 This form establishes @code{let}-style bindings on the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 cells of symbols rather than on the value cells. Each @var{binding}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 must be a list of the form @samp{(@var{name} @var{arglist}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 @var{forms}@dots{})}, which defines a function exactly as if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 it were a @code{defun*} form. The function @var{name} is defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 accordingly for the duration of the body of the @code{flet}; then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 the old function definition, or lack thereof, is restored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 While @code{flet} in Common Lisp establishes a lexical binding of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 @var{name}, Emacs Lisp @code{flet} makes a dynamic binding. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 result is that @code{flet} affects indirect calls to a function as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 well as calls directly inside the @code{flet} form itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 You can use @code{flet} to disable or modify the behavior of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 function in a temporary fashion. This will even work on Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 primitives, although note that some calls to primitive functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 internal to Emacs are made without going through the symbol's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 function cell, and so will not be affected by @code{flet}. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 (flet ((message (&rest args) (push args saved-msgs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 (do-something))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 This code attempts to replace the built-in function @code{message}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 with a function that simply saves the messages in a list rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 than displaying them. The original definition of @code{message}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 will be restored after @code{do-something} exits. This code will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 work fine on messages generated by other Lisp code, but messages
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 generated directly inside Emacs will not be caught since they make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 direct C-language calls to the message routines rather than going
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 through the Lisp @code{message} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 Functions defined by @code{flet} may use the full Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 argument notation supported by @code{defun*}; also, the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 body is enclosed in an implicit block as if by @code{defun*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 @xref{Program Structure}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 @defspec labels (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 The @code{labels} form is a synonym for @code{flet}. (In Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 Lisp, @code{labels} and @code{flet} differ in ways that depend on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 their lexical scoping; these distinctions vanish in dynamically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 scoped Emacs Lisp.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 @node Macro Bindings, , Function Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 @subsection Macro Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 These forms create local macros and ``symbol macros.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 @defspec macrolet (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 This form is analogous to @code{flet}, but for macros instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 functions. Each @var{binding} is a list of the same form as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 arguments to @code{defmacro*} (i.e., a macro name, argument list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 and macro-expander forms). The macro is defined accordingly for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 use within the body of the @code{macrolet}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 Because of the nature of macros, @code{macrolet} is lexically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 scoped even in Emacs Lisp: The @code{macrolet} binding will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 affect only calls that appear physically within the body
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 @var{forms}, possibly after expansion of other macros in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 @defspec symbol-macrolet (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 This form creates @dfn{symbol macros}, which are macros that look
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 like variable references rather than function calls. Each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 @var{binding} is a list @samp{(@var{var} @var{expansion})};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 any reference to @var{var} within the body @var{forms} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 replaced by @var{expansion}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 (setq bar '(5 . 9))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 (symbol-macrolet ((foo (car bar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 (incf foo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 @result{} (6 . 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 A @code{setq} of a symbol macro is treated the same as a @code{setf}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 I.e., @code{(setq foo 4)} in the above would be equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 @code{(setf foo 4)}, which in turn expands to @code{(setf (car bar) 4)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 Likewise, a @code{let} or @code{let*} binding a symbol macro is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 treated like a @code{letf} or @code{letf*}. This differs from true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 Common Lisp, where the rules of lexical scoping cause a @code{let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 binding to shadow a @code{symbol-macrolet} binding. In this package,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 only @code{lexical-let} and @code{lexical-let*} will shadow a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 There is no analogue of @code{defmacro} for symbol macros; all symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 macros are local. A typical use of @code{symbol-macrolet} is in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 expansion of another macro:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 (defmacro* my-dolist ((x list) &rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 (let ((var (gensym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 (list 'loop 'for var 'on list 'do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 (list* 'symbol-macrolet (list (list x (list 'car var)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 body))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 (setq mylist '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 (my-dolist (x mylist) (incf x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 mylist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 @result{} (2 3 4 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 In this example, the @code{my-dolist} macro is similar to @code{dolist}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 (@pxref{Iteration}) except that the variable @code{x} becomes a true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 reference onto the elements of the list. The @code{my-dolist} call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 shown here expands to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 (loop for G1234 on mylist do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 (symbol-macrolet ((x (car G1234)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 (incf x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 which in turn expands to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 (loop for G1234 on mylist do (incf (car G1234)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 @xref{Loop Facility}, for a description of the @code{loop} macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 This package defines a nonstandard @code{in-ref} loop clause that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 works much like @code{my-dolist}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 @node Conditionals, Blocks and Exits, Variable Bindings, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 @section Conditionals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 These conditional forms augment Emacs Lisp's simple @code{if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 @code{and}, @code{or}, and @code{cond} forms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 @defspec when test forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 This is a variant of @code{if} where there are no ``else'' forms,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 and possibly several ``then'' forms. In particular,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 (when @var{test} @var{a} @var{b} @var{c})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 is entirely equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 (if @var{test} (progn @var{a} @var{b} @var{c}) nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 @defspec unless test forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 This is a variant of @code{if} where there are no ``then'' forms,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 and possibly several ``else'' forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 (unless @var{test} @var{a} @var{b} @var{c})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 is entirely equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 (when (not @var{test}) @var{a} @var{b} @var{c})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 @defspec case keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 This macro evaluates @var{keyform}, then compares it with the key
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 values listed in the various @var{clause}s. Whichever clause matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 the key is executed; comparison is done by @code{eql}. If no clause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 matches, the @code{case} form returns @code{nil}. The clauses are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 (@var{keylist} @var{body-forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 where @var{keylist} is a list of key values. If there is exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 one value, and it is not a cons cell or the symbol @code{nil} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 @code{t}, then it can be used by itself as a @var{keylist} without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 being enclosed in a list. All key values in the @code{case} form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 must be distinct. The final clauses may use @code{t} in place of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 a @var{keylist} to indicate a default clause that should be taken
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 if none of the other clauses match. (The symbol @code{otherwise}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 is also recognized in place of @code{t}. To make a clause that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 matches the actual symbol @code{t}, @code{nil}, or @code{otherwise},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 enclose the symbol in a list.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 For example, this expression reads a keystroke, then does one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 four things depending on whether it is an @samp{a}, a @samp{b},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 a @key{RET} or @key{LFD}, or anything else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 (case (read-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 (?a (do-a-thing))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 (?b (do-b-thing))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 ((?\r ?\n) (do-ret-thing))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 (t (do-other-thing)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 @defspec ecase keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017 This macro is just like @code{case}, except that if the key does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 not match any of the clauses, an error is signalled rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 simply returning @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 @defspec typecase keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 This macro is a version of @code{case} that checks for types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 rather than values. Each @var{clause} is of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 @samp{(@var{type} @var{body}...)}. @xref{Type Predicates},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 for a description of type specifiers. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 (typecase x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 (integer (munch-integer x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 (float (munch-float x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 (string (munch-integer (string-to-int x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 (t (munch-anything x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 The type specifier @code{t} matches any type of object; the word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 @code{otherwise} is also allowed. To make one clause match any of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 several types, use an @code{(or ...)} type specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 @defspec etypecase keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 This macro is just like @code{typecase}, except that if the key does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 not match any of the clauses, an error is signalled rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 simply returning @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 @node Blocks and Exits, Iteration, Conditionals, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 @section Blocks and Exits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 Common Lisp @dfn{blocks} provide a non-local exit mechanism very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 similar to @code{catch} and @code{throw}, but lexically rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 dynamically scoped. This package actually implements @code{block}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 in terms of @code{catch}; however, the lexical scoping allows the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 optimizing byte-compiler to omit the costly @code{catch} step if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 body of the block does not actually @code{return-from} the block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 @defspec block name forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 The @var{forms} are evaluated as if by a @code{progn}. However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 if any of the @var{forms} execute @code{(return-from @var{name})},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 they will jump out and return directly from the @code{block} form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 The @code{block} returns the result of the last @var{form} unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 a @code{return-from} occurs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 The @code{block}/@code{return-from} mechanism is quite similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 the @code{catch}/@code{throw} mechanism. The main differences are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 that block @var{name}s are unevaluated symbols, rather than forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 (such as quoted symbols) which evaluate to a tag at run-time; and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 also that blocks are lexically scoped whereas @code{catch}/@code{throw}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 are dynamically scoped. This means that functions called from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 body of a @code{catch} can also @code{throw} to the @code{catch},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 but the @code{return-from} referring to a block name must appear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 physically within the @var{forms} that make up the body of the block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 They may not appear within other called functions, although they may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 appear within macro expansions or @code{lambda}s in the body. Block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 names and @code{catch} names form independent name-spaces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 In true Common Lisp, @code{defun} and @code{defmacro} surround
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 the function or expander bodies with implicit blocks with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 same name as the function or macro. This does not occur in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 Lisp, but this package provides @code{defun*} and @code{defmacro*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 forms which do create the implicit block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 The Common Lisp looping constructs defined by this package,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 such as @code{loop} and @code{dolist}, also create implicit blocks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 just as in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 Because they are implemented in terms of Emacs Lisp @code{catch}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 and @code{throw}, blocks have the same overhead as actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 @code{catch} constructs (roughly two function calls). However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 Zawinski and Furuseth's optimizing byte compiler (standard in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 Emacs 19) will optimize away the @code{catch} if the block does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 not in fact contain any @code{return} or @code{return-from} calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 that jump to it. This means that @code{do} loops and @code{defun*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 functions which don't use @code{return} don't pay the overhead to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 support it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 @defspec return-from name [result]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 This macro returns from the block named @var{name}, which must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 an (unevaluated) symbol. If a @var{result} form is specified, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 is evaluated to produce the result returned from the @code{block}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 Otherwise, @code{nil} is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 @defspec return [result]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 This macro is exactly like @code{(return-from nil @var{result})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 Common Lisp loops like @code{do} and @code{dolist} implicitly enclose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 themselves in @code{nil} blocks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 @node Iteration, Loop Facility, Blocks and Exits, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 @section Iteration
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 The macros described here provide more sophisticated, high-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 looping constructs to complement Emacs Lisp's basic @code{while}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 @defspec loop forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 The @dfn{CL} package supports both the simple, old-style meaning of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 @code{loop} and the extremely powerful and flexible feature known as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 the @dfn{Loop Facility} or @dfn{Loop Macro}. This more advanced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 facility is discussed in the following section; @pxref{Loop Facility}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 The simple form of @code{loop} is described here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 If @code{loop} is followed by zero or more Lisp expressions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 then @code{(loop @var{exprs}@dots{})} simply creates an infinite
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 loop executing the expressions over and over. The loop is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 enclosed in an implicit @code{nil} block. Thus,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 (loop (foo) (if (no-more) (return 72)) (bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 is exactly equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 (block nil (while t (foo) (if (no-more) (return 72)) (bar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 If any of the expressions are plain symbols, the loop is instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 interpreted as a Loop Macro specification as described later.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 (This is not a restriction in practice, since a plain symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 in the above notation would simply access and throw away the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 value of a variable.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 @defspec do (spec@dots{}) (end-test [result@dots{}]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 This macro creates a general iterative loop. Each @var{spec} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 (@var{var} [@var{init} [@var{step}]])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 The loop works as follows: First, each @var{var} is bound to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 associated @var{init} value as if by a @code{let} form. Then, in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 each iteration of the loop, the @var{end-test} is evaluated; if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 true, the loop is finished. Otherwise, the body @var{forms} are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 evaluated, then each @var{var} is set to the associated @var{step}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 expression (as if by a @code{psetq} form) and the next iteration
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 begins. Once the @var{end-test} becomes true, the @var{result}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 forms are evaluated (with the @var{var}s still bound to their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 values) to produce the result returned by @code{do}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 The entire @code{do} loop is enclosed in an implicit @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 block, so that you can use @code{(return)} to break out of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 loop at any time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 If there are no @var{result} forms, the loop returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 If a given @var{var} has no @var{step} form, it is bound to its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 @var{init} value but not otherwise modified during the @code{do}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 loop (unless the code explicitly modifies it); this case is just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 a shorthand for putting a @code{(let ((@var{var} @var{init})) @dots{})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 around the loop. If @var{init} is also omitted it defaults to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 @code{nil}, and in this case a plain @samp{@var{var}} can be used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 in place of @samp{(@var{var})}, again following the analogy with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 @code{let}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 This example (from Steele) illustrates a loop which applies the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 function @code{f} to successive pairs of values from the lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 @code{foo} and @code{bar}; it is equivalent to the call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 @code{(mapcar* 'f foo bar)}. Note that this loop has no body
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 @var{forms} at all, performing all its work as side effects of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 the rest of the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 (do ((x foo (cdr x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 (y bar (cdr y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 (z nil (cons (f (car x) (car y)) z)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 ((or (null x) (null y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 (nreverse z)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 @defspec do* (spec@dots{}) (end-test [result@dots{}]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 This is to @code{do} what @code{let*} is to @code{let}. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 particular, the initial values are bound as if by @code{let*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 rather than @code{let}, and the steps are assigned as if by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 @code{setq} rather than @code{psetq}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204 Here is another way to write the above loop:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 (do* ((xp foo (cdr xp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 (yp bar (cdr yp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 (x (car xp) (car xp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 (y (car yp) (car yp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 ((or (null xp) (null yp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 (nreverse z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 (push (f x y) z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 @defspec dolist (var list [result]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 This is a more specialized loop which iterates across the elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 of a list. @var{list} should evaluate to a list; the body @var{forms}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 are executed with @var{var} bound to each element of the list in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 turn. Finally, the @var{result} form (or @code{nil}) is evaluated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 with @var{var} bound to @code{nil} to produce the result returned by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 the loop. The loop is surrounded by an implicit @code{nil} block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 @defspec dotimes (var count [result]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 This is a more specialized loop which iterates a specified number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229 of times. The body is executed with @var{var} bound to the integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 from zero (inclusive) to @var{count} (exclusive), in turn. Then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 the @code{result} form is evaluated with @var{var} bound to the total
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 number of iterations that were done (i.e., @code{(max 0 @var{count})})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 to get the return value for the loop form. The loop is surrounded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 by an implicit @code{nil} block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 @defspec do-symbols (var [obarray [result]]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 This loop iterates over all interned symbols. If @var{obarray}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 is specified and is not @code{nil}, it loops over all symbols in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 that obarray. For each symbol, the body @var{forms} are evaluated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 with @var{var} bound to that symbol. The symbols are visited in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 an unspecified order. Afterward the @var{result} form, if any,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2243 is evaluated (with @var{var} bound to @code{nil}) to get the return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 value. The loop is surrounded by an implicit @code{nil} block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 @defspec do-all-symbols (var [result]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 This is identical to @code{do-symbols} except that the @var{obarray}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 argument is omitted; it always iterates over the default obarray.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 @xref{Mapping over Sequences}, for some more functions for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 iterating over vectors or lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 @node Loop Facility, Multiple Values, Iteration, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 @section Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 A common complaint with Lisp's traditional looping constructs is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 that they are either too simple and limited, such as Common Lisp's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 @code{dotimes} or Emacs Lisp's @code{while}, or too unreadable and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 obscure, like Common Lisp's @code{do} loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 To remedy this, recent versions of Common Lisp have added a new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 construct called the ``Loop Facility'' or ``@code{loop} macro,''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 with an easy-to-use but very powerful and expressive syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 * Loop Basics:: `loop' macro, basic clause structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 * Loop Examples:: Working examples of `loop' macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 * For Clauses:: Clauses introduced by `for' or `as'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 * Iteration Clauses:: `repeat', `while', `thereis', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 * Accumulation Clauses:: `collect', `sum', `maximize', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 * Other Clauses:: `with', `if', `initially', `finally'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 @node Loop Basics, Loop Examples, Loop Facility, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 @subsection Loop Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 The @code{loop} macro essentially creates a mini-language within
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 Lisp that is specially tailored for describing loops. While this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 language is a little strange-looking by the standards of regular Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284 it turns out to be very easy to learn and well-suited to its purpose.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 Since @code{loop} is a macro, all parsing of the loop language
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 takes place at byte-compile time; compiled @code{loop}s are just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 as efficient as the equivalent @code{while} loops written longhand.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 @defspec loop clauses@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 A loop construct consists of a series of @var{clause}s, each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 introduced by a symbol like @code{for} or @code{do}. Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 are simply strung together in the argument list of @code{loop},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 with minimal extra parentheses. The various types of clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 specify initializations, such as the binding of temporary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 variables, actions to be taken in the loop, stepping actions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 and final cleanup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 Common Lisp specifies a certain general order of clauses in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 loop:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 (loop @var{name-clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 @var{var-clauses}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 @var{action-clauses}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 The @var{name-clause} optionally gives a name to the implicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 block that surrounds the loop. By default, the implicit block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 is named @code{nil}. The @var{var-clauses} specify what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 variables should be bound during the loop, and how they should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 be modified or iterated throughout the course of the loop. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 @var{action-clauses} are things to be done during the loop, such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 as computing, collecting, and returning values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 The Emacs version of the @code{loop} macro is less restrictive about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 the order of clauses, but things will behave most predictably if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 you put the variable-binding clauses @code{with}, @code{for}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 @code{repeat} before the action clauses. As in Common Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 @code{initially} and @code{finally} clauses can go anywhere.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 Loops generally return @code{nil} by default, but you can cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 them to return a value by using an accumulation clause like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 @code{collect}, an end-test clause like @code{always}, or an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 explicit @code{return} clause to jump out of the implicit block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 (Because the loop body is enclosed in an implicit block, you can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 also use regular Lisp @code{return} or @code{return-from} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 break out of the loop.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 The following sections give some examples of the Loop Macro in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 action, and describe the particular loop clauses in great detail.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 Consult the second edition of Steele's @dfn{Common Lisp, the Language},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 for additional discussion and examples of the @code{loop} macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 @node Loop Examples, For Clauses, Loop Basics, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337 @subsection Loop Examples
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 Before listing the full set of clauses that are allowed, let's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341 look at a few example loops just to get a feel for the @code{loop}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342 language.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 (loop for buf in (buffer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 collect (buffer-file-name buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 This loop iterates over all Emacs buffers, using the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 returned by @code{buffer-list}. For each buffer @code{buf},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 it calls @code{buffer-file-name} and collects the results into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 a list, which is then returned from the @code{loop} construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2354 The result is a list of the file names of all the buffers in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 Emacs' memory. The words @code{for}, @code{in}, and @code{collect}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 are reserved words in the @code{loop} language.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 (loop repeat 20 do (insert "Yowsa\n"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 This loop inserts the phrase ``Yowsa'' twenty times in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 (loop until (eobp) do (munch-line) (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 This loop calls @code{munch-line} on every line until the end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 of the buffer. If point is already at the end of the buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 the loop exits immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 (loop do (munch-line) until (eobp) do (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 This loop is similar to the above one, except that @code{munch-line}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 is always called at least once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 (loop for x from 1 to 100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 for y = (* x x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 until (>= y 729)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 finally return (list x (= y 729)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 This more complicated loop searches for a number @code{x} whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 square is 729. For safety's sake it only examines @code{x}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 values up to 100; dropping the phrase @samp{to 100} would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 cause the loop to count upwards with no limit. The second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 @code{for} clause defines @code{y} to be the square of @code{x}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 within the loop; the expression after the @code{=} sign is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 reevaluated each time through the loop. The @code{until}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 clause gives a condition for terminating the loop, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 @code{finally} clause says what to do when the loop finishes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 (This particular example was written less concisely than it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 could have been, just for the sake of illustration.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 Note that even though this loop contains three clauses (two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 @code{for}s and an @code{until}) that would have been enough to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 define loops all by themselves, it still creates a single loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 rather than some sort of triple-nested loop. You must explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 nest your @code{loop} constructs if you want nested loops.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 @node For Clauses, Iteration Clauses, Loop Examples, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 @subsection For Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 Most loops are governed by one or more @code{for} clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 A @code{for} clause simultaneously describes variables to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 bound, how those variables are to be stepped during the loop,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 and usually an end condition based on those variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 The word @code{as} is a synonym for the word @code{for}. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419 word is followed by a variable name, then a word like @code{from}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 or @code{across} that describes the kind of iteration desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 In Common Lisp, the phrase @code{being the} sometimes precedes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 the type of iteration; in this package both @code{being} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 @code{the} are optional. The word @code{each} is a synonym
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 for @code{the}, and the word that follows it may be singular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 or plural: @samp{for x being the elements of y} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 @samp{for x being each element of y}. Which form you use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 is purely a matter of style.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 The variable is bound around the loop as if by @code{let}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 (setq i 'happy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 (loop for i from 1 to 10 do (do-something-with i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 i
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 @result{} happy
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 @item for @var{var} from @var{expr1} to @var{expr2} by @var{expr3}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 This type of @code{for} clause creates a counting loop. Each of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 the three sub-terms is optional, though there must be at least one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 term so that the clause is marked as a counting clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 The three expressions are the starting value, the ending value, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 the step value, respectively, of the variable. The loop counts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 upwards by default (@var{expr3} must be positive), from @var{expr1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 to @var{expr2} inclusively. If you omit the @code{from} term, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 loop counts from zero; if you omit the @code{to} term, the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 counts forever without stopping (unless stopped by some other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 loop clause, of course); if you omit the @code{by} term, the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 counts in steps of one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 You can replace the word @code{from} with @code{upfrom} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 @code{downfrom} to indicate the direction of the loop. Likewise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 you can replace @code{to} with @code{upto} or @code{downto}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 For example, @samp{for x from 5 downto 1} executes five times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 with @code{x} taking on the integers from 5 down to 1 in turn.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 Also, you can replace @code{to} with @code{below} or @code{above},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 which are like @code{upto} and @code{downto} respectively except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 that they are exclusive rather than inclusive limits:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 (loop for x to 10 collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 @result{} (0 1 2 3 4 5 6 7 8 9 10)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 (loop for x below 10 collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 @result{} (0 1 2 3 4 5 6 7 8 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 The @code{by} value is always positive, even for downward-counting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 loops. Some sort of @code{from} value is required for downward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 loops; @samp{for x downto 5} is not a legal loop clause all by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 @item for @var{var} in @var{list} by @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 This clause iterates @var{var} over all the elements of @var{list},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 in turn. If you specify the @code{by} term, then @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 is used to traverse the list instead of @code{cdr}; it must be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478 function taking one argument. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 (loop for x in '(1 2 3 4 5 6) collect (* x x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 @result{} (1 4 9 16 25 36)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483 (loop for x in '(1 2 3 4 5 6) by 'cddr collect (* x x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 @result{} (1 9 25)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 @item for @var{var} on @var{list} by @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 This clause iterates @var{var} over all the cons cells of @var{list}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 (loop for x on '(1 2 3 4) collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 @result{} ((1 2 3 4) (2 3 4) (3 4) (4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495 With @code{by}, there is no real reason that the @code{on} expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 must be a list. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 (loop for x on first-animal by 'next-animal collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 where @code{(next-animal x)} takes an ``animal'' @var{x} and returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 the next in the (assumed) sequence of animals, or @code{nil} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505 @var{x} was the last animal in the sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 @item for @var{var} in-ref @var{list} by @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 This is like a regular @code{in} clause, but @var{var} becomes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 a @code{setf}-able ``reference'' onto the elements of the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 rather than just a temporary variable. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 (loop for x in-ref my-list do (incf x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 increments every element of @code{my-list} in place. This clause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 is an extension to standard Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 @item for @var{var} across @var{array}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 This clause iterates @var{var} over all the elements of @var{array},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 which may be a vector or a string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 (loop for x across "aeiou"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 do (use-vowel (char-to-string x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 @item for @var{var} across-ref @var{array}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 This clause iterates over an array, with @var{var} a @code{setf}-able
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 reference onto the elements; see @code{in-ref} above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 @item for @var{var} being the elements of @var{sequence}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 This clause iterates over the elements of @var{sequence}, which may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 be a list, vector, or string. Since the type must be determined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 at run-time, this is somewhat less efficient than @code{in} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 @code{across}. The clause may be followed by the additional term
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538 @samp{using (index @var{var2})} to cause @var{var2} to be bound to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 the successive indices (starting at 0) of the elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 This clause type is taken from older versions of the @code{loop} macro,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 and is not present in modern Common Lisp. The @samp{using (sequence ...)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 term of the older macros is not supported.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 @item for @var{var} being the elements of-ref @var{sequence}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 This clause iterates over a sequence, with @var{var} a @code{setf}-able
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547 reference onto the elements; see @code{in-ref} above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 @item for @var{var} being the symbols [of @var{obarray}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 This clause iterates over symbols, either over all interned symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 or over all symbols in @var{obarray}. The loop is executed with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 @var{var} bound to each symbol in turn. The symbols are visited in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 an unspecified order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555 As an example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 (loop for sym being the symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 when (fboundp sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 when (string-match "^map" (symbol-name sym))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 collect sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 returns a list of all the functions whose names begin with @samp{map}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 The Common Lisp words @code{external-symbols} and @code{present-symbols}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 are also recognized but are equivalent to @code{symbols} in Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 Due to a minor implementation restriction, it will not work to have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 more than one @code{for} clause iterating over symbols, hash tables,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 keymaps, overlays, or intervals in a given @code{loop}. Fortunately,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 it would rarely if ever be useful to do so. It @emph{is} legal to mix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 one of these types of clauses with other clauses like @code{for ... to}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575 or @code{while}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 @item for @var{var} being the hash-keys of @var{hash-table}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 This clause iterates over the entries in @var{hash-table}. For each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 hash table entry, @var{var} is bound to the entry's key. If you write
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 @samp{the hash-values} instead, @var{var} is bound to the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 of the entries. The clause may be followed by the additional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 term @samp{using (hash-values @var{var2})} (where @code{hash-values}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 is the opposite word of the word following @code{the}) to cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584 @var{var} and @var{var2} to be bound to the two parts of each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 hash table entry.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 @item for @var{var} being the key-codes of @var{keymap}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 This clause iterates over the entries in @var{keymap}. In GNU Emacs 18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 and 19, keymaps are either alists or vectors, and key-codes are integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 or symbols. In XEmacs, keymaps are a special new data type, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2591 key-codes are symbols or lists of symbols. The iteration does not enter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 nested keymaps or inherited (parent) keymaps. You can use @samp{the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2593 key-bindings} to access the commands bound to the keys rather than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 key codes, and you can add a @code{using} clause to access both the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 codes and the bindings together.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 @item for @var{var} being the key-seqs of @var{keymap}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 This clause iterates over all key sequences defined by @var{keymap}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 and its nested keymaps, where @var{var} takes on values which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600 strings in Emacs 18 or vectors in Emacs 19. The strings or vectors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2601 are reused for each iteration, so you must copy them if you wish to keep
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 them permanently. You can add a @samp{using (key-bindings ...)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 clause to get the command bindings as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 @item for @var{var} being the overlays [of @var{buffer}] @dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 This clause iterates over the Emacs 19 ``overlays'' or XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 ``extents'' of a buffer (the clause @code{extents} is synonymous with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 @code{overlays}). Under Emacs 18, this clause iterates zero times. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609 the @code{of} term is omitted, the current buffer is used. This clause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 also accepts optional @samp{from @var{pos}} and @samp{to @var{pos}}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 terms, limiting the clause to overlays which overlap the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 @item for @var{var} being the intervals [of @var{buffer}] @dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 This clause iterates over all intervals of a buffer with constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 text properties. The variable @var{var} will be bound to conses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 of start and end positions, where one start position is always equal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 to the previous end position. The clause allows @code{of},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 @code{from}, @code{to}, and @code{property} terms, where the latter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 term restricts the search to just the specified property. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 @code{of} term may specify either a buffer or a string. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 clause is useful only in GNU Emacs 19; in other versions, all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 buffers and strings consist of a single interval.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 @item for @var{var} being the frames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 This clause iterates over all frames, i.e., X window system windows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 open on Emacs files. This clause works only under Emacs 19. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 clause @code{screens} is a synonym for @code{frames}. The frames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 are visited in @code{next-frame} order starting from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 @code{selected-frame}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 @item for @var{var} being the windows [of @var{frame}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 This clause iterates over the windows (in the Emacs sense) of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 the current frame, or of the specified @var{frame}. (In Emacs 18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 there is only ever one frame, and the @code{of} term is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 allowed there.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 @item for @var{var} being the buffers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 This clause iterates over all buffers in Emacs. It is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 to @samp{for @var{var} in (buffer-list)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 @item for @var{var} = @var{expr1} then @var{expr2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 This clause does a general iteration. The first time through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644 the loop, @var{var} will be bound to @var{expr1}. On the second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 and successive iterations it will be set by evaluating @var{expr2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 (which may refer to the old value of @var{var}). For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647 these two loops are effectively the same:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 (loop for x on my-list by 'cddr do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 (loop for x = my-list then (cddr x) while x do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 Note that this type of @code{for} clause does not imply any sort
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 of terminating condition; the above example combines it with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 @code{while} clause to tell when to end the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 If you omit the @code{then} term, @var{expr1} is used both for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 the initial setting and for successive settings:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 (loop for x = (random) when (> x 0) return x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 This loop keeps taking random numbers from the @code{(random)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 function until it gets a positive one, which it then returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 If you include several @code{for} clauses in a row, they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 treated sequentially (as if by @code{let*} and @code{setq}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 You can instead use the word @code{and} to link the clauses,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 in which case they are processed in parallel (as if by @code{let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 and @code{psetq}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 (loop for x below 5 for y = nil then x collect (list x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 @result{} ((0 nil) (1 1) (2 2) (3 3) (4 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 (loop for x below 5 and y = nil then x collect (list x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 @result{} ((0 nil) (1 0) (2 1) (3 2) (4 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 In the first loop, @code{y} is set based on the value of @code{x}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 that was just set by the previous clause; in the second loop,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 @code{x} and @code{y} are set simultaneously so @code{y} is set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 based on the value of @code{x} left over from the previous time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 through the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 Another feature of the @code{loop} macro is @dfn{destructuring},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 similar in concept to the destructuring provided by @code{defmacro}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 The @var{var} part of any @code{for} clause can be given as a list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 of variables instead of a single variable. The values produced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 during loop execution must be lists; the values in the lists are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695 stored in the corresponding variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2698 (loop for (x y) in '((2 3) (4 5) (6 7)) collect (+ x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 @result{} (5 9 13)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 In loop destructuring, if there are more values than variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 the trailing values are ignored, and if there are more variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 than values the trailing variables get the value @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 If @code{nil} is used as a variable name, the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 values are ignored. Destructuring may be nested, and dotted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 lists of variables like @code{(x . y)} are allowed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 @node Iteration Clauses, Accumulation Clauses, For Clauses, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710 @subsection Iteration Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 Aside from @code{for} clauses, there are several other loop clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 that control the way the loop operates. They might be used by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 themselves, or in conjunction with one or more @code{for} clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 @item repeat @var{integer}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 This clause simply counts up to the specified number using an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 internal temporary variable. The loops
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 (loop repeat n do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 (loop for temp to n do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 are identical except that the second one forces you to choose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 a name for a variable you aren't actually going to use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 @item while @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 This clause stops the loop when the specified condition (any Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 expression) becomes @code{nil}. For example, the following two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 loops are equivalent, except for the implicit @code{nil} block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735 that surrounds the second one:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 (while @var{cond} @var{forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 (loop while @var{cond} do @var{forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 @item until @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 This clause stops the loop when the specified condition is true,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 i.e., non-@code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 @item always @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 This clause stops the loop when the specified condition is @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 Unlike @code{while}, it stops the loop using @code{return nil} so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 the @code{finally} clauses are not executed. If all the conditions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750 were non-@code{nil}, the loop returns @code{t}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 (if (loop for size in size-list always (> size 10))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 (some-big-sizes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 (no-big-sizes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 @item never @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 This clause is like @code{always}, except that the loop returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 @code{t} if any conditions were false, or @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 @item thereis @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 This clause stops the loop when the specified form is non-@code{nil};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 in this case, it returns that non-@code{nil} value. If all the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 values were @code{nil}, the loop returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 @node Accumulation Clauses, Other Clauses, Iteration Clauses, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 @subsection Accumulation Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 These clauses cause the loop to accumulate information about the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 specified Lisp @var{form}. The accumulated result is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 from the loop unless overridden, say, by a @code{return} clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 @item collect @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 This clause collects the values of @var{form} into a list. Several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 examples of @code{collect} appear elsewhere in this manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 The word @code{collecting} is a synonym for @code{collect}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 likewise for the other accumulation clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 @item append @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 This clause collects lists of values into a result list using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 @code{append}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 @item nconc @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 This clause collects lists of values into a result list by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 destructively modifying the lists rather than copying them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 @item concat @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 This clause concatenates the values of the specified @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 into a string. (It and the following clause are extensions to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 standard Common Lisp.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 @item vconcat @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 This clause concatenates the values of the specified @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 into a vector.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 @item count @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 This clause counts the number of times the specified @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803 evaluates to a non-@code{nil} value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 @item sum @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 This clause accumulates the sum of the values of the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 @var{form}, which must evaluate to a number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 @item maximize @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 This clause accumulates the maximum value of the specified @var{form},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 which must evaluate to a number. The return value is undefined if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 @code{maximize} is executed zero times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 @item minimize @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 This clause accumulates the minimum value of the specified @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 Accumulation clauses can be followed by @samp{into @var{var}} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 cause the data to be collected into variable @var{var} (which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 automatically @code{let}-bound during the loop) rather than an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 unnamed temporary variable. Also, @code{into} accumulations do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 not automatically imply a return value. The loop must use some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 explicit mechanism, such as @code{finally return}, to return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 the accumulated result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 It is legal for several accumulation clauses of the same type to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 accumulate into the same place. From Steele:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 (loop for name in '(fred sue alice joe june)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 for kids in '((bob ken) () () (kris sunshine) ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 collect name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 append kids)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 @result{} (fred bob ken sue alice joe kris sunshine june)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 @node Other Clauses, , Accumulation Clauses, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838 @subsection Other Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841 This section describes the remaining loop clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 @item with @var{var} = @var{value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 This clause binds a variable to a value around the loop, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 otherwise leaves the variable alone during the loop. The following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 loops are basically equivalent:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 (loop with x = 17 do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 (let ((x 17)) (loop do ...))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 (loop for x = 17 then x do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 Naturally, the variable @var{var} might be used for some purpose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856 in the rest of the loop. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 (loop for x in my-list with res = nil do (push x res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 finally return res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863 This loop inserts the elements of @code{my-list} at the front of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 a new list being accumulated in @code{res}, then returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865 list @code{res} at the end of the loop. The effect is similar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 to that of a @code{collect} clause, but the list gets reversed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 by virtue of the fact that elements are being pushed onto the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 front of @code{res} rather than the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 If you omit the @code{=} term, the variable is initialized to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 @code{nil}. (Thus the @samp{= nil} in the above example is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 unnecessary.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 Bindings made by @code{with} are sequential by default, as if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 by @code{let*}. Just like @code{for} clauses, @code{with} clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2876 can be linked with @code{and} to cause the bindings to be made by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877 @code{let} instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 @item if @var{condition} @var{clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 This clause executes the following loop clause only if the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 condition is true. The following @var{clause} should be an accumulation,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 @code{do}, @code{return}, @code{if}, or @code{unless} clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 Several clauses may be linked by separating them with @code{and}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 These clauses may be followed by @code{else} and a clause or clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 to execute if the condition was false. The whole construct may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 optionally be followed by the word @code{end} (which may be used to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 disambiguate an @code{else} or @code{and} in a nested @code{if}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 The actual non-@code{nil} value of the condition form is available
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 by the name @code{it} in the ``then'' part. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 (setq funny-numbers '(6 13 -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 @result{} (6 13 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 (loop for x below 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 if (oddp x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 collect x into odds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 and if (memq x funny-numbers) return (cdr it) end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 collect x into evens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 finally return (vector odds evens))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 @result{} [(1 3 5 7 9) (0 2 4 6 8)]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 (setq funny-numbers '(6 7 13 -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 @result{} (6 7 13 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 (loop <@r{same thing again}>)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 @result{} (13 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 Note the use of @code{and} to put two clauses into the ``then''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 part, one of which is itself an @code{if} clause. Note also that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 @code{end}, while normally optional, was necessary here to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 it clear that the @code{else} refers to the outermost @code{if}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 clause. In the first case, the loop returns a vector of lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 of the odd and even values of @var{x}. In the second case, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 odd number 7 is one of the @code{funny-numbers} so the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 returns early; the actual returned value is based on the result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 of the @code{memq} call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 @item when @var{condition} @var{clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 This clause is just a synonym for @code{if}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 @item unless @var{condition} @var{clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 The @code{unless} clause is just like @code{if} except that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924 sense of the condition is reversed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 @item named @var{name}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 This clause gives a name other than @code{nil} to the implicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 block surrounding the loop. The @var{name} is the symbol to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 used as the block name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 @item initially [do] @var{forms}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 This keyword introduces one or more Lisp forms which will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 executed before the loop itself begins (but after any variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 requested by @code{for} or @code{with} have been bound to their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 initial values). @code{initially} clauses can appear anywhere;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 if there are several, they are executed in the order they appear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937 in the loop. The keyword @code{do} is optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 @item finally [do] @var{forms}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 This introduces Lisp forms which will be executed after the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 finishes (say, on request of a @code{for} or @code{while}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 @code{initially} and @code{finally} clauses may appear anywhere
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 in the loop construct, but they are executed (in the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 order) at the beginning or end, respectively, of the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 @item finally return @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 This says that @var{form} should be executed after the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 is done to obtain a return value. (Without this, or some other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 clause like @code{collect} or @code{return}, the loop will simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 return @code{nil}.) Variables bound by @code{for}, @code{with},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 or @code{into} will still contain their final values when @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 is executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 @item do @var{forms}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 The word @code{do} may be followed by any number of Lisp expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956 which are executed as an implicit @code{progn} in the body of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 loop. Many of the examples in this section illustrate the use of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 @code{do}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 @item return @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 This clause causes the loop to return immediately. The following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 Lisp form is evaluated to give the return value of the @code{loop}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 form. The @code{finally} clauses, if any, are not executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 Of course, @code{return} is generally used inside an @code{if} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 @code{unless}, as its use in a top-level loop clause would mean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966 the loop would never get to ``loop'' more than once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 The clause @samp{return @var{form}} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 @samp{do (return @var{form})} (or @code{return-from} if the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 was named). The @code{return} clause is implemented a bit more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 efficiently, though.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974 While there is no high-level way to add user extensions to @code{loop}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 (comparable to @code{defsetf} for @code{setf}, say), this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 does offer two properties called @code{cl-loop-handler} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 @code{cl-loop-for-handler} which are functions to be called when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 a given symbol is encountered as a top-level loop clause or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 @code{for} clause, respectively. Consult the source code in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 file @file{cl-macs.el} for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 This package's @code{loop} macro is compatible with that of Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 Lisp, except that a few features are not implemented: @code{loop-finish}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 and data-type specifiers. Naturally, the @code{for} clauses which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 iterate over keymaps, overlays, intervals, frames, windows, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 buffers are Emacs-specific extensions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 @node Multiple Values, , Loop Facility, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 @section Multiple Values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 Common Lisp functions can return zero or more results. Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 functions, by contrast, always return exactly one result. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 package makes no attempt to emulate Common Lisp multiple return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 values; Emacs versions of Common Lisp functions that return more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 than one value either return just the first value (as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 @code{compiler-macroexpand}) or return a list of values (as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 @code{get-setf-method}). This package @emph{does} define placeholders
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 for the Common Lisp functions that work with multiple values, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 in Emacs Lisp these functions simply operate on lists instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 The @code{values} form, for example, is a synonym for @code{list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 in Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 @defspec multiple-value-bind (var@dots{}) values-form forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 This form evaluates @var{values-form}, which must return a list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 values. It then binds the @var{var}s to these respective values,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 as if by @code{let}, and then executes the body @var{forms}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008 If there are more @var{var}s than values, the extra @var{var}s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 are bound to @code{nil}. If there are fewer @var{var}s than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 values, the excess values are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 @defspec multiple-value-setq (var@dots{}) form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 This form evaluates @var{form}, which must return a list of values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 It then sets the @var{var}s to these respective values, as if by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 @code{setq}. Extra @var{var}s or values are treated the same as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 in @code{multiple-value-bind}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 The older Quiroz package attempted a more faithful (but still
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 imperfect) emulation of Common Lisp multiple values. The old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 method ``usually'' simulated true multiple values quite well,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 but under certain circumstances would leave spurious return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 values in memory where a later, unrelated @code{multiple-value-bind}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 form would see them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 Since a perfect emulation is not feasible in Emacs Lisp, this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 package opts to keep it as simple and predictable as possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 @node Macros, Declarations, Control Structure, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 @chapter Macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 This package implements the various Common Lisp features of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 @code{defmacro}, such as destructuring, @code{&environment},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 and @code{&body}. Top-level @code{&whole} is not implemented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 for @code{defmacro} due to technical difficulties.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 @xref{Argument Lists}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 Destructuring is made available to the user by way of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 following macro:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 @defspec destructuring-bind arglist expr forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 This macro expands to code which executes @var{forms}, with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 the variables in @var{arglist} bound to the list of values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 returned by @var{expr}. The @var{arglist} can include all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 the features allowed for @code{defmacro} argument lists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 including destructuring. (The @code{&environment} keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 is not allowed.) The macro expansion will signal an error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 if @var{expr} returns a list of the wrong number of arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 or with incorrect keyword arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 This package also includes the Common Lisp @code{define-compiler-macro}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 facility, which allows you to define compile-time expansions and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056 optimizations for your functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 @defspec define-compiler-macro name arglist forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 This form is similar to @code{defmacro}, except that it only expands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 calls to @var{name} at compile-time; calls processed by the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 interpreter are not expanded, nor are they expanded by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 @code{macroexpand} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064 The argument list may begin with a @code{&whole} keyword and a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 variable. This variable is bound to the macro-call form itself,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 i.e., to a list of the form @samp{(@var{name} @var{args}@dots{})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 If the macro expander returns this form unchanged, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068 compiler treats it as a normal function call. This allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 compiler macros to work as optimizers for special cases of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070 function, leaving complicated cases alone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 For example, here is a simplified version of a definition that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 appears as a standard part of this package:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 (define-compiler-macro member* (&whole form a list &rest keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 (if (and (null keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 (eq (car-safe a) 'quote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 (not (floatp-safe (cadr a))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 (list 'memq a list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 This definition causes @code{(member* @var{a} @var{list})} to change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 to a call to the faster @code{memq} in the common case where @var{a}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087 is a non-floating-point constant; if @var{a} is anything else, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 if there are any keyword arguments in the call, then the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 @code{member*} call is left intact. (The actual compiler macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 for @code{member*} optimizes a number of other cases, including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 common @code{:test} predicates.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 @defun compiler-macroexpand form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 This function is analogous to @code{macroexpand}, except that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 expands compiler macros rather than regular macros. It returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 @var{form} unchanged if it is not a call to a function for which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 a compiler macro has been defined, or if that compiler macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 decided to punt by returning its @code{&whole} argument. Like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 @code{macroexpand}, it expands repeatedly until it reaches a form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 for which no further expansion is possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 @xref{Macro Bindings}, for descriptions of the @code{macrolet}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 and @code{symbol-macrolet} forms for making ``local'' macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 definitions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 @node Declarations, Symbols, Macros, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 @chapter Declarations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 Common Lisp includes a complex and powerful ``declaration''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 mechanism that allows you to give the compiler special hints
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 about the types of data that will be stored in particular variables,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 and about the ways those variables and functions will be used. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 package defines versions of all the Common Lisp declaration forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 @code{declare}, @code{locally}, @code{proclaim}, @code{declaim},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 and @code{the}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 Most of the Common Lisp declarations are not currently useful in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 Emacs Lisp, as the byte-code system provides little opportunity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 to benefit from type information, and @code{special} declarations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 are redundant in a fully dynamically-scoped Lisp. A few
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 declarations are meaningful when the optimizing Emacs 19 byte
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 compiler is being used, however. Under the earlier non-optimizing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126 compiler, these declarations will effectively be ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 @defun proclaim decl-spec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 This function records a ``global'' declaration specified by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 @var{decl-spec}. Since @code{proclaim} is a function, @var{decl-spec}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 is evaluated and thus should normally be quoted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 @defspec declaim decl-specs@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 This macro is like @code{proclaim}, except that it takes any number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 of @var{decl-spec} arguments, and the arguments are unevaluated and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 unquoted. The @code{declaim} macro also puts an @code{(eval-when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 (compile load eval) ...)} around the declarations so that they will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3139 be registered at compile-time as well as at run-time. (This is vital,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 since normally the declarations are meant to influence the way the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 compiler treats the rest of the file that contains the @code{declaim}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 form.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 @defspec declare decl-specs@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 This macro is used to make declarations within functions and other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 code. Common Lisp allows declarations in various locations, generally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 at the beginning of any of the many ``implicit @code{progn}s''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 throughout Lisp syntax, such as function bodies, @code{let} bodies,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 etc. Currently the only declaration understood by @code{declare}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 is @code{special}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 @defspec locally declarations@dots{} forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 In this package, @code{locally} is no different from @code{progn}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 @defspec the type form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 Type information provided by @code{the} is ignored in this package;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 in other words, @code{(the @var{type} @var{form})} is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 to @var{form}. Future versions of the optimizing byte-compiler may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 make use of this information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 For example, @code{mapcar} can map over both lists and arrays. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 hard for the compiler to expand @code{mapcar} into an in-line loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 unless it knows whether the sequence will be a list or an array ahead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 of time. With @code{(mapcar 'car (the vector foo))}, a future
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 compiler would have enough information to expand the loop in-line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 For now, Emacs Lisp will treat the above code as exactly equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 to @code{(mapcar 'car foo)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 Each @var{decl-spec} in a @code{proclaim}, @code{declaim}, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 @code{declare} should be a list beginning with a symbol that says
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 what kind of declaration it is. This package currently understands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 @code{special}, @code{inline}, @code{notinline}, @code{optimize},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 and @code{warn} declarations. (The @code{warn} declaration is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 extension of standard Common Lisp.) Other Common Lisp declarations,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179 such as @code{type} and @code{ftype}, are silently ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 @item special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 Since all variables in Emacs Lisp are ``special'' (in the Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 Lisp sense), @code{special} declarations are only advisory. They
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 simply tell the optimizing byte compiler that the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 variables are intentionally being referred to without being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 bound in the body of the function. The compiler normally emits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 warnings for such references, since they could be typographical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 errors for references to local variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 The declaration @code{(declare (special @var{var1} @var{var2}))} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 equivalent to @code{(defvar @var{var1}) (defvar @var{var2})} in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 optimizing compiler, or to nothing at all in older compilers (which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 do not warn for non-local references).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 In top-level contexts, it is generally better to write
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 @code{(defvar @var{var})} than @code{(declaim (special @var{var}))},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 since @code{defvar} makes your intentions clearer. But the older
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199 byte compilers can not handle @code{defvar}s appearing inside of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 functions, while @code{(declare (special @var{var}))} takes care
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201 to work correctly with all compilers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 @item inline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 The @code{inline} @var{decl-spec} lists one or more functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 whose bodies should be expanded ``in-line'' into calling functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 whenever the compiler is able to arrange for it. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 the Common Lisp function @code{cadr} is declared @code{inline}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 by this package so that the form @code{(cadr @var{x})} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 expand directly into @code{(car (cdr @var{x}))} when it is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 in user functions, for a savings of one (relatively expensive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 function call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 The following declarations are all equivalent. Note that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 @code{defsubst} form is a convenient way to define a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 and declare it inline all at once, but it is available only in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216 Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 (declaim (inline foo bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 (eval-when (compile load eval) (proclaim '(inline foo bar)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3221 (proclaim-inline foo bar) ; XEmacs only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3222 (defsubst foo (...) ...) ; instead of defun; Emacs 19 only
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 @strong{Please note:} This declaration remains in effect after the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 containing source file is done. It is correct to use it to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 request that a function you have defined should be inlined,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 but it is impolite to use it to request inlining of an external
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 In Common Lisp, it is possible to use @code{(declare (inline @dots{}))}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 before a particular call to a function to cause just that call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 be inlined; the current byte compilers provide no way to implement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 this, so @code{(declare (inline @dots{}))} is currently ignored by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 this package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 @item notinline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 The @code{notinline} declaration lists functions which should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 not be inlined after all; it cancels a previous @code{inline}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 declaration.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 @item optimize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 This declaration controls how much optimization is performed by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 the compiler. Naturally, it is ignored by the earlier non-optimizing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245 compilers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 The word @code{optimize} is followed by any number of lists like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 @code{(speed 3)} or @code{(safety 2)}. Common Lisp defines several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 optimization ``qualities''; this package ignores all but @code{speed}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 and @code{safety}. The value of a quality should be an integer from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 0 to 3, with 0 meaning ``unimportant'' and 3 meaning ``very important.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 The default level for both qualities is 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 In this package, with the Emacs 19 optimizing compiler, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 @code{speed} quality is tied to the @code{byte-compile-optimize}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256 flag, which is set to @code{nil} for @code{(speed 0)} and to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 @code{t} for higher settings; and the @code{safety} quality is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 tied to the @code{byte-compile-delete-errors} flag, which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3259 set to @code{t} for @code{(safety 3)} and to @code{nil} for all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 lower settings. (The latter flag controls whether the compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 is allowed to optimize out code whose only side-effect could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 be to signal an error, e.g., rewriting @code{(progn foo bar)} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263 @code{bar} when it is not known whether @code{foo} will be bound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 at run-time.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 Note that even compiling with @code{(safety 0)}, the Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 byte-code system provides sufficient checking to prevent real
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 harm from being done. For example, barring serious bugs in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 Emacs itself, Emacs will not crash with a segmentation fault
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 just because of an error in a fully-optimized Lisp program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 The @code{optimize} declaration is normally used in a top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 @code{proclaim} or @code{declaim} in a file; Common Lisp allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274 it to be used with @code{declare} to set the level of optimization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 locally for a given form, but this will not work correctly with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 current version of the optimizing compiler. (The @code{declare}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 will set the new optimization level, but that level will not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278 automatically be unset after the enclosing form is done.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 @item warn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 This declaration controls what sorts of warnings are generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 by the byte compiler. Again, only the optimizing compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 generates warnings. The word @code{warn} is followed by any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 number of ``warning qualities,'' similar in form to optimization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 qualities. The currently supported warning types are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 @code{redefine}, @code{callargs}, @code{unresolved}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 @code{free-vars}; in the current system, a value of 0 will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 disable these warnings and any higher value will enable them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 See the documentation for the optimizing byte compiler for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 @node Symbols, Numbers, Declarations, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 @chapter Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 This package defines several symbol-related features that were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 missing from Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 @menu
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3300 * Property Lists:: `getf', `remf'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 * Creating Symbols:: `gensym', `gentemp'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 @node Property Lists, Creating Symbols, Symbols, Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 @section Property Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308 These functions augment the standard Emacs Lisp functions @code{get}
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3309 and @code{put} for operating on properties attached to objects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 There are also functions for working with property lists as
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3311 first-class data structures not attached to particular objects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 @defun getf place property &optional default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 This function scans the list @var{place} as if it were a property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 list, i.e., a list of alternating property names and values. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316 an even-numbered element of @var{place} is found which is @code{eq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 to @var{property}, the following odd-numbered element is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 Otherwise, @var{default} is returned (or @code{nil} if no default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 is given).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321 In particular,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 (get sym prop) @equiv{} (getf (symbol-plist sym) prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3327 It is legal to use @code{getf} as a @code{setf} place, in which case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 its @var{place} argument must itself be a legal @code{setf} place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 The @var{default} argument, if any, is ignored in this context.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3330 The effect is to change (via @code{setcar}) the value cell in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3331 list that corresponds to @var{property}, or to cons a new property-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332 pair onto the list if the property is not yet present.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 (put sym prop val) @equiv{} (setf (getf (symbol-plist sym) prop) val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3337
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
3338 The @code{get} function is also @code{setf}-able. The fact that
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
3339 @code{default} is ignored can sometimes be useful:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3341 @example
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
3342 (incf (get 'foo 'usage-count 0))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345 Here, symbol @code{foo}'s @code{usage-count} property is incremented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346 if it exists, or set to 1 (an incremented 0) otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3348 When not used as a @code{setf} form, @code{getf} is just a regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 function and its @var{place} argument can actually be any Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350 expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 @defspec remf place property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 This macro removes the property-value pair for @var{property} from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3355 the property list stored at @var{place}, which is any @code{setf}-able
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 place expression. It returns true if the property was found. Note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3357 that if @var{property} happens to be first on the list, this will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 effectively do a @code{(setf @var{place} (cddr @var{place}))},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 whereas if it occurs later, this simply uses @code{setcdr} to splice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 out the property and value cells.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 @secno=2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 @node Creating Symbols, , Property Lists, Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368 @section Creating Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371 These functions create unique symbols, typically for use as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372 temporary variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 @defun gensym &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 This function creates a new, uninterned symbol (using @code{make-symbol})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 with a unique name. (The name of an uninterned symbol is relevant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 only if the symbol is printed.) By default, the name is generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 from an increasing sequence of numbers, @samp{G1000}, @samp{G1001},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3379 @samp{G1002}, etc. If the optional argument @var{x} is a string, that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 string is used as a prefix instead of @samp{G}. Uninterned symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 are used in macro expansions for temporary variables, to ensure that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 their names will not conflict with ``real'' variables in the user's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 @defvar *gensym-counter*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 This variable holds the counter used to generate @code{gensym} names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 It is incremented after each use by @code{gensym}. In Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 this is initialized with 0, but this package initializes it with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 random (time-dependent) value to avoid trouble when two files that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391 each used @code{gensym} in their compilation are loaded together.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393 @strong{XEmacs note:} As of XEmacs 21.0, an uninterned symbol remains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 uninterned even after being dumped to bytecode. Older versions of Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 didn't distinguish the printed representation of interned and uninterned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396 symbols, so their names had to be treated more carefully.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 @defun gentemp &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400 This function is like @code{gensym}, except that it produces a new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 @emph{interned} symbol. If the symbol that is generated already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402 exists, the function keeps incrementing the counter and trying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403 again until a new symbol is generated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 The Quiroz @file{cl.el} package also defined a @code{defkeyword}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 form for creating self-quoting keyword symbols. This package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 automatically creates all keywords that are called for by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 @code{&key} argument specifiers, and discourages the use of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 keywords as data unrelated to keyword arguments, so the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411 @code{defkeyword} form has been discontinued.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 @chapno=11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 @node Numbers, Sequences, Symbols, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418 @chapter Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 This section defines a few simple Common Lisp operations on numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422 which were left out of Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 * Predicates on Numbers:: `plusp', `oddp', `floatp-safe', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 * Numerical Functions:: `abs', `expt', `floor*', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 * Random Numbers:: `random*', `make-random-state'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 * Implementation Parameters:: `most-positive-fixnum', `most-positive-float'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 @secno=1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 @node Predicates on Numbers, Numerical Functions, Numbers, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436 @section Predicates on Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 These functions return @code{t} if the specified condition is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440 true of the numerical argument, or @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 @defun plusp number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443 This predicate tests whether @var{number} is positive. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444 error if the argument is not a number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 @defun minusp number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3448 This predicate tests whether @var{number} is negative. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 error if the argument is not a number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 @defun oddp integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 This predicate tests whether @var{integer} is odd. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 error if the argument is not an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 @defun evenp integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 This predicate tests whether @var{integer} is even. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 error if the argument is not an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 @defun floatp-safe object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 This predicate tests whether @var{object} is a floating-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 number. On systems that support floating-point, this is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 to @code{floatp}. On other systems, this always returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 @secno=3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472 @node Numerical Functions, Random Numbers, Predicates on Numbers, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473 @section Numerical Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476 These functions perform various arithmetic operations on numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 @defun abs number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 This function returns the absolute value of @var{number}. (Newer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 versions of Emacs provide this as a built-in function; this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 defines @code{abs} only for Emacs 18 versions which don't provide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 it as a primitive.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 @defun expt base power
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 This function returns @var{base} raised to the power of @var{number}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 (Newer versions of Emacs provide this as a built-in function; this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 package defines @code{expt} only for Emacs 18 versions which don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 provide it as a primitive.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492 @defun gcd &rest integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 This function returns the Greatest Common Divisor of the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 For one argument, it returns the absolute value of that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495 For zero arguments, it returns zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 @defun lcm &rest integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 This function returns the Least Common Multiple of the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 For one argument, it returns the absolute value of that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 For zero arguments, it returns one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 @defun isqrt integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 This function computes the ``integer square root'' of its integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3506 argument, i.e., the greatest integer less than or equal to the true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 square root of the argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 @defun floor* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 This function implements the Common Lisp @code{floor} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 It is called @code{floor*} to avoid name conflicts with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513 simpler @code{floor} function built-in to Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 With one argument, @code{floor*} returns a list of two numbers:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 The argument rounded down (toward minus infinity) to an integer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 and the ``remainder'' which would have to be added back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 first return value to yield the argument again. If the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3519 is an integer @var{x}, the result is always the list @code{(@var{x} 0)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520 If the argument is an Emacs 19 floating-point number, the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3521 result is a Lisp integer and the second is a Lisp float between
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522 0 (inclusive) and 1 (exclusive).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 With two arguments, @code{floor*} divides @var{number} by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 @var{divisor}, and returns the floor of the quotient and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526 corresponding remainder as a list of two numbers. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 @code{(floor* @var{x} @var{y})} returns @code{(@var{q} @var{r})},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3528 then @code{@var{q}*@var{y} + @var{r} = @var{x}}, with @var{r}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 between 0 (inclusive) and @var{r} (exclusive). Also, note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 that @code{(floor* @var{x})} is exactly equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531 @code{(floor* @var{x} 1)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 This function is entirely compatible with Common Lisp's @code{floor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 function, except that it returns the two results in a list since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 Emacs Lisp does not support multiple-valued functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 @defun ceiling* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 This function implements the Common Lisp @code{ceiling} function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 which is analogous to @code{floor} except that it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 argument or quotient of the arguments up toward plus infinity.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 The remainder will be between 0 and minus @var{r}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 @defun truncate* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 This function implements the Common Lisp @code{truncate} function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 which is analogous to @code{floor} except that it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 argument or quotient of the arguments toward zero. Thus it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 equivalent to @code{floor*} if the argument or quotient is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 positive, or to @code{ceiling*} otherwise. The remainder has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 the same sign as @var{number}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 @defun round* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 This function implements the Common Lisp @code{round} function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 which is analogous to @code{floor} except that it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 argument or quotient of the arguments to the nearest integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 In the case of a tie (the argument or quotient is exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 halfway between two integers), it rounds to the even integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562 @defun mod* number divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 This function returns the same value as the second return value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 of @code{floor}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 @defun rem* number divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 This function returns the same value as the second return value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 of @code{truncate}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3572 These definitions are compatible with those in the Quiroz
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 @file{cl.el} package, except that this package appends @samp{*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 to certain function names to avoid conflicts with existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 Emacs 19 functions, and that the mechanism for returning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576 multiple values is different.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 @secno=8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 @node Random Numbers, Implementation Parameters, Numerical Functions, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583 @section Random Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 This package also provides an implementation of the Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587 random number generator. It uses its own additive-congruential
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 algorithm, which is much more likely to give statistically clean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 random numbers than the simple generators supplied by many
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590 operating systems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 @defun random* number &optional state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 This function returns a random nonnegative number less than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 @var{number}, and of the same type (either integer or floating-point).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 The @var{state} argument should be a @code{random-state} object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 which holds the state of the random number generator. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 function modifies this state object as a side effect. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 @var{state} is omitted, it defaults to the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 @code{*random-state*}, which contains a pre-initialized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 @code{random-state} object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 @defvar *random-state*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 This variable contains the system ``default'' @code{random-state}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 object, used for calls to @code{random*} that do not specify an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 alternative state object. Since any number of programs in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 Emacs process may be accessing @code{*random-state*} in interleaved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 fashion, the sequence generated from this variable will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 irreproducible for all intents and purposes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 @defun make-random-state &optional state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 This function creates or copies a @code{random-state} object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3614 If @var{state} is omitted or @code{nil}, it returns a new copy of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 @code{*random-state*}. This is a copy in the sense that future
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 sequences of calls to @code{(random* @var{n})} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 @code{(random* @var{n} @var{s})} (where @var{s} is the new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 random-state object) will return identical sequences of random
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619 numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 If @var{state} is a @code{random-state} object, this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3622 returns a copy of that object. If @var{state} is @code{t}, this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 function returns a new @code{random-state} object seeded from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3624 date and time. As an extension to Common Lisp, @var{state} may also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3625 be an integer in which case the new object is seeded from that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 integer; each different integer seed will result in a completely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627 different sequence of random numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3629 It is legal to print a @code{random-state} object to a buffer or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3630 file and later read it back with @code{read}. If a program wishes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 to use a sequence of pseudo-random numbers which can be reproduced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 later for debugging, it can call @code{(make-random-state t)} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3633 get a new sequence, then print this sequence to a file. When the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3634 program is later rerun, it can read the original run's random-state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 from the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 @defun random-state-p object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 This predicate returns @code{t} if @var{object} is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 @code{random-state} object, or @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 @node Implementation Parameters, , Random Numbers, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644 @section Implementation Parameters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647 This package defines several useful constants having to with numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649 @defvar most-positive-fixnum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 This constant equals the largest value a Lisp integer can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 It is typically @code{2^23-1} or @code{2^25-1}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 @defvar most-negative-fixnum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 This constant equals the smallest (most negative) value a Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656 integer can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 The following parameters have to do with floating-point numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 This package determines their values by exercising the computer's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 floating-point arithmetic in various ways. Because this operation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3662 might be slow, the code for initializing them is kept in a separate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663 function that must be called before the parameters can be used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 @defun cl-float-limits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 This function makes sure that the Common Lisp floating-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 parameters like @code{most-positive-float} have been initialized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 Until it is called, these parameters will be @code{nil}. If this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 version of Emacs does not support floats (e.g., most versions of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 Emacs 18), the parameters will remain @code{nil}. If the parameters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671 have already been initialized, the function returns immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 The algorithm makes assumptions that will be valid for most modern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 machines, but will fail if the machine's arithmetic is extremely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 unusual, e.g., decimal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 Since true Common Lisp supports up to four different floating-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 precisions, it has families of constants like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 @code{most-positive-single-float}, @code{most-positive-double-float},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 @code{most-positive-long-float}, and so on. Emacs has only one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 floating-point precision, so this package omits the precision word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683 from the constants' names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 @defvar most-positive-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 This constant equals the largest value a Lisp float can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 For those systems whose arithmetic supports infinities, this is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 the largest @emph{finite} value. For IEEE machines, the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 is approximately @code{1.79e+308}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 @defvar most-negative-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 This constant equals the most-negative value a Lisp float can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 (It is assumed to be equal to @code{(- most-positive-float)}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 @defvar least-positive-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 This constant equals the smallest Lisp float value greater than zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3699 For IEEE machines, it is about @code{4.94e-324} if denormals are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 supported or @code{2.22e-308} if not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 @defvar least-positive-normalized-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 This constant equals the smallest @emph{normalized} Lisp float greater
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 than zero, i.e., the smallest value for which IEEE denormalization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 will not result in a loss of precision. For IEEE machines, this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3707 value is about @code{2.22e-308}. For machines that do not support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 the concept of denormalization and gradual underflow, this constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 will always equal @code{least-positive-float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 @defvar least-negative-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 This constant is the negative counterpart of @code{least-positive-float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 @defvar least-negative-normalized-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 This constant is the negative counterpart of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 @code{least-positive-normalized-float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 @defvar float-epsilon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 This constant is the smallest positive Lisp float that can be added
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3723 to 1.0 to produce a distinct value. Adding a smaller number to 1.0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 will yield 1.0 again due to roundoff. For IEEE machines, epsilon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725 is about @code{2.22e-16}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 @defvar float-negative-epsilon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729 This is the smallest positive value that can be subtracted from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3730 1.0 to produce a distinct value. For IEEE machines, it is about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 @code{1.11e-16}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 @chapno=13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738 @node Sequences, Lists, Numbers, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739 @chapter Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3741 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3742 Common Lisp defines a number of functions that operate on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3743 @dfn{sequences}, which are either lists, strings, or vectors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3744 Emacs Lisp includes a few of these, notably @code{elt} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3745 @code{length}; this package defines most of the rest.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3746
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3747 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3748 * Sequence Basics:: Arguments shared by all sequence functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3749 * Mapping over Sequences:: `mapcar*', `mapcan', `map', `every', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3750 * Sequence Functions:: `subseq', `remove*', `substitute', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3751 * Searching Sequences:: `find', `position', `count', `search', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 * Sorting Sequences:: `sort*', `stable-sort', `merge'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 @node Sequence Basics, Mapping over Sequences, Sequences, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756 @section Sequence Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3757
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 446
diff changeset
3758 @noindent Many of the sequence functions take keyword arguments;
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 446
diff changeset
3759 @pxref{Argument Lists}. All keyword arguments are optional and, if
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 446
diff changeset
3760 specified, may appear in any order.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 The @code{:key} argument should be passed either @code{nil}, or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 function of one argument. This key function is used as a filter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 through which the elements of the sequence are seen; for example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3765 @code{(find x y :key 'car)} is similar to @code{(assoc* x y)}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 It searches for an element of the list whose @code{car} equals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 @code{x}, rather than for an element which equals @code{x} itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 If @code{:key} is omitted or @code{nil}, the filter is effectively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769 the identity function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 The @code{:test} and @code{:test-not} arguments should be either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 @code{nil}, or functions of two arguments. The test function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 used to compare two sequence elements, or to compare a search value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 with sequence elements. (The two values are passed to the test
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 function in the same order as the original sequence function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 arguments from which they are derived, or, if they both come from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3777 the same sequence, in the same order as they appear in that sequence.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 The @code{:test} argument specifies a function which must return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 true (non-@code{nil}) to indicate a match; instead, you may use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 @code{:test-not} to give a function which returns @emph{false} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781 indicate a match. The default test function is @code{:test 'eql}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3783 Many functions which take @var{item} and @code{:test} or @code{:test-not}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 arguments also come in @code{-if} and @code{-if-not} varieties,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 where a @var{predicate} function is passed instead of @var{item},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 and sequence elements match if the predicate returns true on them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787 (or false in the case of @code{-if-not}). For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790 (remove* 0 seq :test '=) @equiv{} (remove-if 'zerop seq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794 to remove all zeros from sequence @code{seq}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 Some operations can work on a subsequence of the argument sequence;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 these function take @code{:start} and @code{:end} arguments which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798 default to zero and the length of the sequence, respectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 Only elements between @var{start} (inclusive) and @var{end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 (exclusive) are affected by the operation. The @var{end} argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801 may be passed @code{nil} to signify the length of the sequence;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 otherwise, both @var{start} and @var{end} must be integers, with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 @code{0 <= @var{start} <= @var{end} <= (length @var{seq})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 If the function takes two sequence arguments, the limits are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 defined by keywords @code{:start1} and @code{:end1} for the first,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806 and @code{:start2} and @code{:end2} for the second.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 A few functions accept a @code{:from-end} argument, which, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 non-@code{nil}, causes the operation to go from right-to-left
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 through the sequence instead of left-to-right, and a @code{:count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 argument, which specifies an integer maximum number of elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812 to be removed or otherwise processed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 The sequence functions make no guarantees about the order in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 which the @code{:test}, @code{:test-not}, and @code{:key} functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3816 are called on various elements. Therefore, it is a bad idea to depend
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 on side effects of these functions. For example, @code{:from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3818 may cause the sequence to be scanned actually in reverse, or it may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 be scanned forwards but computing a result ``as if'' it were scanned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 backwards. (Some functions, like @code{mapcar*} and @code{every},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 @emph{do} specify exactly the order in which the function is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822 so side effects are perfectly acceptable in those cases.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 Strings in GNU Emacs 19 may contain ``text properties'' as well
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 as character data. Except as noted, it is undefined whether or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 not text properties are preserved by sequence functions. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3827 example, @code{(remove* ?A @var{str})} may or may not preserve
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 the properties of the characters copied from @var{str} into the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829 result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831 @node Mapping over Sequences, Sequence Functions, Sequence Basics, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832 @section Mapping over Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 These functions ``map'' the function you specify over the elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3836 of lists or arrays. They are all variations on the theme of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837 built-in function @code{mapcar}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 @defun mapcar* function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 This function calls @var{function} on successive parallel sets of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 elements from its argument sequences. Given a single @var{seq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 argument it is equivalent to @code{mapcar}; given @var{n} sequences,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3843 it calls the function with the first elements of each of the sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3844 as the @var{n} arguments to yield the first element of the result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3845 list, then with the second elements, and so on. The mapping stops as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 soon as the shortest sequence runs out. The argument sequences may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 be any mixture of lists, strings, and vectors; the return sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848 is always a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850 Common Lisp's @code{mapcar} accepts multiple arguments but works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 only on lists; Emacs Lisp's @code{mapcar} accepts a single sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3852 argument. This package's @code{mapcar*} works as a compatible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3853 superset of both.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856 @defun map result-type function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 This function maps @var{function} over the argument sequences,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 just like @code{mapcar*}, but it returns a sequence of type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859 @var{result-type} rather than a list. @var{result-type} must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 be one of the following symbols: @code{vector}, @code{string},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 @code{list} (in which case the effect is the same as for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862 @code{mapcar*}), or @code{nil} (in which case the results are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 thrown away and @code{map} returns @code{nil}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 @defun maplist function list &rest more-lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 This function calls @var{function} on each of its argument lists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3868 then on the @code{cdr}s of those lists, and so on, until the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3869 shortest list runs out. The results are returned in the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3870 of a list. Thus, @code{maplist} is like @code{mapcar*} except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3871 that it passes in the list pointers themselves rather than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3872 @code{car}s of the advancing pointers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 @defun mapc function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 This function is like @code{mapcar*}, except that the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 returned by @var{function} are ignored and thrown away rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 than being collected into a list. The return value of @code{mapc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 is @var{seq}, the first sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 @defun mapl function list &rest more-lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 This function is like @code{maplist}, except that it throws away
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 the values returned by @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 @defun mapcan function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 This function is like @code{mapcar*}, except that it concatenates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 the return values (which must be lists) using @code{nconc},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 rather than simply collecting them into a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 @defun mapcon function list &rest more-lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 This function is like @code{maplist}, except that it concatenates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895 the return values using @code{nconc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3896 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 @defun some predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3899 This function calls @var{predicate} on each element of @var{seq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 in turn; if @var{predicate} returns a non-@code{nil} value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3901 @code{some} returns that value, otherwise it returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3902 Given several sequence arguments, it steps through the sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903 in parallel until the shortest one runs out, just as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3904 @code{mapcar*}. You can rely on the left-to-right order in which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905 the elements are visited, and on the fact that mapping stops
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 immediately as soon as @var{predicate} returns non-@code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909 @defun every predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 This function calls @var{predicate} on each element of the sequence(s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 in turn; it returns @code{nil} as soon as @var{predicate} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3912 @code{nil} for any element, or @code{t} if the predicate was true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913 for all elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3914 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3916 @defun notany predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 This function calls @var{predicate} on each element of the sequence(s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 in turn; it returns @code{nil} as soon as @var{predicate} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3919 a non-@code{nil} value for any element, or @code{t} if the predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3920 was @code{nil} for all elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3921 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3923 @defun notevery predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 This function calls @var{predicate} on each element of the sequence(s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3925 in turn; it returns a non-@code{nil} value as soon as @var{predicate}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3926 returns @code{nil} for any element, or @code{t} if the predicate was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927 true for all elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3930 @defun reduce function seq @t{&key :from-end :start :end :initial-value :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931 This function combines the elements of @var{seq} using an associative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932 binary operation. Suppose @var{function} is @code{*} and @var{seq} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3933 the list @code{(2 3 4 5)}. The first two elements of the list are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 combined with @code{(* 2 3) = 6}; this is combined with the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935 element, @code{(* 6 4) = 24}, and that is combined with the final
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3936 element: @code{(* 24 5) = 120}. Note that the @code{*} function happens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3937 to be self-reducing, so that @code{(* 2 3 4 5)} has the same effect as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3938 an explicit call to @code{reduce}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3940 If @code{:from-end} is true, the reduction is right-associative instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941 of left-associative:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 (reduce '- '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3945 @equiv{} (- (- (- 1 2) 3) 4) @result{} -8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 (reduce '- '(1 2 3 4) :from-end t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 @equiv{} (- 1 (- 2 (- 3 4))) @result{} -2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3950 If @code{:key} is specified, it is a function of one argument which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951 is called on each of the sequence elements in turn.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 If @code{:initial-value} is specified, it is effectively added to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3954 front (or rear in the case of @code{:from-end}) of the sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955 The @code{:key} function is @emph{not} applied to the initial value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 If the sequence, including the initial value, has exactly one element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 then that element is returned without ever calling @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3959 If the sequence is empty (and there is no initial value), then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 @var{function} is called with no arguments to obtain the return value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 All of these mapping operations can be expressed conveniently in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964 terms of the @code{loop} macro. In compiled code, @code{loop} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3965 be faster since it generates the loop as in-line code with no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966 function calls.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3968 @node Sequence Functions, Searching Sequences, Mapping over Sequences, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3969 @section Sequence Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3971 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3972 This section describes a number of Common Lisp functions for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3973 operating on sequences.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3975 @defun subseq sequence start &optional end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3976 This function returns a given subsequence of the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3977 @var{sequence}, which may be a list, string, or vector.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 The indices @var{start} and @var{end} must be in range, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3979 @var{start} must be no greater than @var{end}. If @var{end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980 is omitted, it defaults to the length of the sequence. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 return value is always a copy; it does not share structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982 with @var{sequence}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3983
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3984 As an extension to Common Lisp, @var{start} and/or @var{end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985 may be negative, in which case they represent a distance back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 from the end of the sequence. This is for compatibility with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 Emacs' @code{substring} function. Note that @code{subseq} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 the @emph{only} sequence function that allows negative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989 @var{start} and @var{end}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3991 You can use @code{setf} on a @code{subseq} form to replace a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 specified range of elements with elements from another sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 The replacement is done as if by @code{replace}, described below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 @defun concatenate result-type &rest seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 This function concatenates the argument sequences together to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 form a result sequence of type @var{result-type}, one of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 symbols @code{vector}, @code{string}, or @code{list}. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000 arguments are always copied, even in cases such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 @code{(concatenate 'list '(1 2 3))} where the result is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 identical to an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 @defun fill seq item @t{&key :start :end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006 This function fills the elements of the sequence (or the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 part of the sequence) with the value @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010 @defun replace seq1 seq2 @t{&key :start1 :end1 :start2 :end2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 This function copies part of @var{seq2} into part of @var{seq1}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 The sequence @var{seq1} is not stretched or resized; the amount
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 of data copied is simply the shorter of the source and destination
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014 (sub)sequences. The function returns @var{seq1}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 If @var{seq1} and @var{seq2} are @code{eq}, then the replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017 will work correctly even if the regions indicated by the start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 and end arguments overlap. However, if @var{seq1} and @var{seq2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 are lists which share storage but are not @code{eq}, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 start and end arguments specify overlapping regions, the effect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 is undefined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4024 @defun remove* item seq @t{&key :test :test-not :key :count :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 This returns a copy of @var{seq} with all elements matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026 @var{item} removed. The result may share storage with or be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 @code{eq} to @var{seq} in some circumstances, but the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 @var{seq} will not be modified. The @code{:test}, @code{:test-not},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029 and @code{:key} arguments define the matching test that is used;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 by default, elements @code{eql} to @var{item} are removed. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4031 @code{:count} argument specifies the maximum number of matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 elements that can be removed (only the leftmost @var{count} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 are removed). The @code{:start} and @code{:end} arguments specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 a region in @var{seq} in which elements will be removed; elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 outside that region are not matched or removed. The @code{:from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036 argument, if true, says that elements should be deleted from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037 end of the sequence rather than the beginning (this matters only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4038 if @var{count} was also specified).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4039 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4041 @defun delete* item seq @t{&key :test :test-not :key :count :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 This deletes all elements of @var{seq} which match @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 It is a destructive operation. Since Emacs Lisp does not support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 stretchable strings or vectors, this is the same as @code{remove*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045 for those sequence types. On lists, @code{remove*} will copy the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 list if necessary to preserve the original list, whereas
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 @code{delete*} will splice out parts of the argument list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 Compare @code{append} and @code{nconc}, which are analogous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 non-destructive and destructive list operations in Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 @findex remove-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053 @findex remove-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4054 @findex delete-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055 @findex delete-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 The predicate-oriented functions @code{remove-if}, @code{remove-if-not},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057 @code{delete-if}, and @code{delete-if-not} are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 @defun delete item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 This MacLisp-compatible function deletes from @var{list} all elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061 which are @code{equal} to @var{item}. The @code{delete} function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4062 built-in to Emacs 19; this package defines it equivalently in Emacs 18.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 @defun remove item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 This function removes from @var{list} all elements which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 @code{equal} to @var{item}. This package defines it for symmetry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 with @code{delete}, even though @code{remove} is not built-in to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 @defun remq item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 This function removes from @var{list} all elements which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 @code{eq} to @var{item}. This package defines it for symmetry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 with @code{delq}, even though @code{remq} is not built-in to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4079 @defun remove-duplicates seq @t{&key :test :test-not :key :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 This function returns a copy of @var{seq} with duplicate elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4081 removed. Specifically, if two elements from the sequence match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 according to the @code{:test}, @code{:test-not}, and @code{:key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4083 arguments, only the rightmost one is retained. If @code{:from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4084 is true, the leftmost one is retained instead. If @code{:start} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4085 @code{:end} is specified, only elements within that subsequence are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 examined or removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4089 @defun delete-duplicates seq @t{&key :test :test-not :key :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090 This function deletes duplicate elements from @var{seq}. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 a destructive version of @code{remove-duplicates}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4094 @defun substitute new old seq @t{&key :test :test-not :key :count :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 This function returns a copy of @var{seq}, with all elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 matching @var{old} replaced with @var{new}. The @code{:count},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4097 @code{:start}, @code{:end}, and @code{:from-end} arguments may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 used to limit the number of substitutions made.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4101 @defun nsubstitute new old seq @t{&key :test :test-not :key :count :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 This is a destructive version of @code{substitute}; it performs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 the substitution using @code{setcar} or @code{aset} rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 by returning a changed copy of the sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 @findex substitute-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108 @findex substitute-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4109 @findex nsubstitute-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110 @findex nsubstitute-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 The @code{substitute-if}, @code{substitute-if-not}, @code{nsubstitute-if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 and @code{nsubstitute-if-not} functions are defined similarly. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4113 these, a @var{predicate} is given in place of the @var{old} argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115 @node Searching Sequences, Sorting Sequences, Sequence Functions, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116 @section Searching Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 These functions search for elements or subsequences in a sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120 (See also @code{member*} and @code{assoc*}; @pxref{Lists}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4122 @defun find item seq @t{&key :test :test-not :key :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123 This function searches @var{seq} for an element matching @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 If it finds a match, it returns the matching element. Otherwise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 it returns @code{nil}. It returns the leftmost match, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 @code{:from-end} is true, in which case it returns the rightmost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 match. The @code{:start} and @code{:end} arguments may be used to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 limit the range of elements that are searched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4131 @defun position item seq @t{&key :test :test-not :key :start :end :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 This function is like @code{find}, except that it returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 integer position in the sequence of the matching item rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 the item itself. The position is relative to the start of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4135 sequence as a whole, even if @code{:start} is non-zero. The function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136 returns @code{nil} if no matching element was found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 @defun count item seq @t{&key :test :test-not :key :start :end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 This function returns the number of elements of @var{seq} which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141 match @var{item}. The result is always a nonnegative integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 @findex find-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4145 @findex find-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 @findex position-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4147 @findex position-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 @findex count-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149 @findex count-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4150 The @code{find-if}, @code{find-if-not}, @code{position-if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 @code{position-if-not}, @code{count-if}, and @code{count-if-not}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152 functions are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4154 @defun mismatch seq1 seq2 @t{&key :test :test-not :key :start1 :end1 :start2 :end2 :from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 This function compares the specified parts of @var{seq1} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4156 @var{seq2}. If they are the same length and the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157 elements match (according to @code{:test}, @code{:test-not},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 and @code{:key}), the function returns @code{nil}. If there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 a mismatch, the function returns the index (relative to @var{seq1})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4160 of the first mismatching element. This will be the leftmost pair of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4161 elements which do not match, or the position at which the shorter of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162 the two otherwise-matching sequences runs out.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4164 If @code{:from-end} is true, then the elements are compared from right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4165 to left starting at @code{(1- @var{end1})} and @code{(1- @var{end2})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 If the sequences differ, then one plus the index of the rightmost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167 difference (relative to @var{seq1}) is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 An interesting example is @code{(mismatch str1 str2 :key 'upcase)},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 which compares two strings case-insensitively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4173 @defun search seq1 seq2 @t{&key :test :test-not :key :from-end :start1 :end1 :start2 :end2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 This function searches @var{seq2} for a subsequence that matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 @var{seq1} (or part of it specified by @code{:start1} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 @code{:end1}.) Only matches which fall entirely within the region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 defined by @code{:start2} and @code{:end2} will be considered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 The return value is the index of the leftmost element of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 leftmost match, relative to the start of @var{seq2}, or @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 if no matches were found. If @code{:from-end} is true, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 function finds the @emph{rightmost} matching subsequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 @node Sorting Sequences, , Searching Sequences, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185 @section Sorting Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 @defun sort* seq predicate @t{&key :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188 This function sorts @var{seq} into increasing order as determined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 by using @var{predicate} to compare pairs of elements. @var{predicate}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4190 should return true (non-@code{nil}) if and only if its first argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 is less than (not equal to) its second argument. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 @code{<} and @code{string-lessp} are suitable predicate functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 for sorting numbers and strings, respectively; @code{>} would sort
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194 numbers into decreasing rather than increasing order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 This function differs from Emacs' built-in @code{sort} in that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 can operate on any type of sequence, not just lists. Also, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198 accepts a @code{:key} argument which is used to preprocess data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199 fed to the @var{predicate} function. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 (setq data (sort data 'string-lessp :key 'downcase))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 sorts @var{data}, a sequence of strings, into increasing alphabetical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207 order without regard to case. A @code{:key} function of @code{car}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208 would be useful for sorting association lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 The @code{sort*} function is destructive; it sorts lists by actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 rearranging the @code{cdr} pointers in suitable fashion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 @defun stable-sort seq predicate @t{&key :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 This function sorts @var{seq} @dfn{stably}, meaning two elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216 which are equal in terms of @var{predicate} are guaranteed not to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217 be rearranged out of their original order by the sort.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 In practice, @code{sort*} and @code{stable-sort} are equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220 in Emacs Lisp because the underlying @code{sort} function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221 stable by default. However, this package reserves the right to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 use non-stable methods for @code{sort*} in the future.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 @defun merge type seq1 seq2 predicate @t{&key :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 This function merges two sequences @var{seq1} and @var{seq2} by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 interleaving their elements. The result sequence, of type @var{type}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228 (in the sense of @code{concatenate}), has length equal to the sum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 of the lengths of the two input sequences. The sequences may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 modified destructively. Order of elements within @var{seq1} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 @var{seq2} is preserved in the interleaving; elements of the two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 sequences are compared by @var{predicate} (in the sense of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 @code{sort}) and the lesser element goes first in the result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 When elements are equal, those from @var{seq1} precede those from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4235 @var{seq2} in the result. Thus, if @var{seq1} and @var{seq2} are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 both sorted according to @var{predicate}, then the result will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 a merged sequence which is (stably) sorted according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 @var{predicate}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 @node Lists, Hash Tables, Sequences, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4242 @chapter Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4245 The functions described here operate on lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248 * List Functions:: `caddr', `first', `last', `list*', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4249 * Substitution of Expressions:: `subst', `sublis', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4250 * Lists as Sets:: `member*', `adjoin', `union', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 * Association Lists:: `assoc*', `rassoc*', `acons', `pairlis'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 @node List Functions, Substitution of Expressions, Lists, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255 @section List Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 This section describes a number of simple operations on lists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259 i.e., chains of cons cells.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261 @defun caddr x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 This function is equivalent to @code{(car (cdr (cdr @var{x})))}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 Likewise, this package defines all 28 @code{c@var{xxx}r} functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4264 where @var{xxx} is up to four @samp{a}s and/or @samp{d}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 All of these functions are @code{setf}-able, and calls to them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 are expanded inline by the byte-compiler for maximum efficiency.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 @defun first x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 This function is a synonym for @code{(car @var{x})}. Likewise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 the functions @code{second}, @code{third}, @dots{}, through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 @code{tenth} return the given element of the list @var{x}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 @defun rest x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 This function is a synonym for @code{(cdr @var{x})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 @defun endp x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 Common Lisp defines this function to act like @code{null}, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4281 signalling an error if @code{x} is neither a @code{nil} nor a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 cons cell. This package simply defines @code{endp} as a synonym
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 for @code{null}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 @defun list-length x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 This function returns the length of list @var{x}, exactly like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 @code{(length @var{x})}, except that if @var{x} is a circular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 list (where the cdr-chain forms a loop rather than terminating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 with @code{nil}), this function returns @code{nil}. (The regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 @code{length} function would get stuck if given a circular list.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4294 @defun last x &optional n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4295 This function returns the last cons, or the @var{n}th-to-last cons,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4296 of the list @var{x}. If @var{n} is omitted it defaults to 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 The ``last cons'' means the first cons cell of the list whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 @code{cdr} is not another cons cell. (For normal lists, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4299 @code{cdr} of the last cons will be @code{nil}.) This function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 returns @code{nil} if @var{x} is @code{nil} or shorter than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 @var{n}. Note that the last @emph{element} of the list is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 @code{(car (last @var{x}))}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 @defun butlast x &optional n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4306 This function returns the list @var{x} with the last element,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4307 or the last @var{n} elements, removed. If @var{n} is greater
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4308 than zero it makes a copy of the list so as not to damage the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 original list. In general, @code{(append (butlast @var{x} @var{n})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4310 (last @var{x} @var{n}))} will return a list equal to @var{x}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4311 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 @defun nbutlast x &optional n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 This is a version of @code{butlast} that works by destructively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 modifying the @code{cdr} of the appropriate element, rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4316 making a copy of the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 @defun list* arg &rest others
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4320 This function constructs a list of its arguments. The final
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 argument becomes the @code{cdr} of the last cell constructed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 Thus, @code{(list* @var{a} @var{b} @var{c})} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323 @code{(cons @var{a} (cons @var{b} @var{c}))}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 @code{(list* @var{a} @var{b} nil)} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325 @code{(list @var{a} @var{b})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 (Note that this function really is called @code{list*} in Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4328 Lisp; it is not a name invented for this package like @code{member*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329 or @code{defun*}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4330 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 @defun ldiff list sublist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4333 If @var{sublist} is a sublist of @var{list}, i.e., is @code{eq} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 one of the cons cells of @var{list}, then this function returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4335 a copy of the part of @var{list} up to but not including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336 @var{sublist}. For example, @code{(ldiff x (cddr x))} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4337 the first two elements of the list @code{x}. The result is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 copy; the original @var{list} is not modified. If @var{sublist}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4339 is not a sublist of @var{list}, a copy of the entire @var{list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343 @defun copy-list list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 This function returns a copy of the list @var{list}. It copies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 dotted lists like @code{(1 2 . 3)} correctly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 @defun copy-tree x &optional vecp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4349 This function returns a copy of the tree of cons cells @var{x}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 Unlike @code{copy-sequence} (and its alias @code{copy-list}),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 which copies only along the @code{cdr} direction, this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 copies (recursively) along both the @code{car} and the @code{cdr}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 directions. If @var{x} is not a cons cell, the function simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 returns @var{x} unchanged. If the optional @var{vecp} argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 is true, this function copies vectors (recursively) as well as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 cons cells.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 @defun tree-equal x y @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 This function compares two trees of cons cells. If @var{x} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4361 @var{y} are both cons cells, their @code{car}s and @code{cdr}s are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 compared recursively. If neither @var{x} nor @var{y} is a cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 cell, they are compared by @code{eql}, or according to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364 specified test. The @code{:key} function, if specified, is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4365 applied to the elements of both trees. @xref{Sequences}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 @secno=3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 @node Substitution of Expressions, Lists as Sets, List Functions, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373 @section Substitution of Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 These functions substitute elements throughout a tree of cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377 cells. (@xref{Sequence Functions}, for the @code{substitute}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378 function, which works on just the top-level elements of a list.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380 @defun subst new old tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 This function substitutes occurrences of @var{old} with @var{new}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 in @var{tree}, a tree of cons cells. It returns a substituted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4383 tree, which will be a copy except that it may share storage with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 the argument @var{tree} in parts where no substitutions occurred.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4385 The original @var{tree} is not modified. This function recurses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4386 on, and compares against @var{old}, both @code{car}s and @code{cdr}s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4387 of the component cons cells. If @var{old} is itself a cons cell,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4388 then matching cells in the tree are substituted as usual without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 recursively substituting in that cell. Comparisons with @var{old}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 are done according to the specified test (@code{eql} by default).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 The @code{:key} function is applied to the elements of the tree
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 but not to @var{old}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395 @defun nsubst new old tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4396 This function is like @code{subst}, except that it works by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 destructive modification (by @code{setcar} or @code{setcdr})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4398 rather than copying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4399 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401 @findex subst-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 @findex subst-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 @findex nsubst-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404 @findex nsubst-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405 The @code{subst-if}, @code{subst-if-not}, @code{nsubst-if}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406 @code{nsubst-if-not} functions are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408 @defun sublis alist tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4409 This function is like @code{subst}, except that it takes an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 association list @var{alist} of @var{old}-@var{new} pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4411 Each element of the tree (after applying the @code{:key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412 function, if any), is compared with the @code{car}s of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 @var{alist}; if it matches, it is replaced by the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4414 @code{cdr}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4415 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417 @defun nsublis alist tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 This is a destructive version of @code{sublis}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421 @node Lists as Sets, Association Lists, Substitution of Expressions, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422 @section Lists as Sets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4424 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4425 These functions perform operations on lists which represent sets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4426 of elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4428 @defun member item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4429 This MacLisp-compatible function searches @var{list} for an element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 which is @code{equal} to @var{item}. The @code{member} function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4431 built-in to Emacs 19; this package defines it equivalently in Emacs 18.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432 See the following function for a Common-Lisp compatible version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 @defun member* item list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436 This function searches @var{list} for an element matching @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4437 If a match is found, it returns the cons cell whose @code{car} was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 the matching element. Otherwise, it returns @code{nil}. Elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4439 are compared by @code{eql} by default; you can use the @code{:test},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 @code{:test-not}, and @code{:key} arguments to modify this behavior.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441 @xref{Sequences}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 Note that this function's name is suffixed by @samp{*} to avoid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 the incompatible @code{member} function defined in Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 (That function uses @code{equal} for comparisons; it is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4446 to @code{(member* @var{item} @var{list} :test 'equal)}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4449 @findex member-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4450 @findex member-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451 The @code{member-if} and @code{member-if-not} functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452 analogously search for elements which satisfy a given predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454 @defun tailp sublist list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4455 This function returns @code{t} if @var{sublist} is a sublist of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4456 @var{list}, i.e., if @var{sublist} is @code{eql} to @var{list} or to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 any of its @code{cdr}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 @defun adjoin item list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4461 This function conses @var{item} onto the front of @var{list},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4462 like @code{(cons @var{item} @var{list})}, but only if @var{item}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4463 is not already present on the list (as determined by @code{member*}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4464 If a @code{:key} argument is specified, it is applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465 @var{item} as well as to the elements of @var{list} during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 the search, on the reasoning that @var{item} is ``about'' to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 become part of the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 @defun union list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471 This function combines two lists which represent sets of items,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 returning a list that represents the union of those two sets.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 The result list will contain all items which appear in @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 or @var{list2}, and no others. If an item appears in both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 @var{list1} and @var{list2} it will be copied only once. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 an item is duplicated in @var{list1} or @var{list2}, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 undefined whether or not that duplication will survive in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 result list. The order of elements in the result list is also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479 undefined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482 @defun nunion list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483 This is a destructive version of @code{union}; rather than copying,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 it tries to reuse the storage of the argument lists if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4487 @defun intersection list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488 This function computes the intersection of the sets represented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 by @var{list1} and @var{list2}. It returns the list of items
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 which appear in both @var{list1} and @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 @defun nintersection list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4494 This is a destructive version of @code{intersection}. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495 tries to reuse storage of @var{list1} rather than copying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 It does @emph{not} reuse the storage of @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499 @defun set-difference list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 This function computes the ``set difference'' of @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 and @var{list2}, i.e., the set of elements that appear in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 @var{list1} but @emph{not} in @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 @defun nset-difference list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4506 This is a destructive @code{set-difference}, which will try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507 to reuse @var{list1} if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510 @defun set-exclusive-or list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4511 This function computes the ``set exclusive or'' of @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4512 and @var{list2}, i.e., the set of elements that appear in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513 exactly one of @var{list1} and @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 @defun nset-exclusive-or list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4517 This is a destructive @code{set-exclusive-or}, which will try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518 to reuse @var{list1} and @var{list2} if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 @defun subsetp list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 This function checks whether @var{list1} represents a subset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523 of @var{list2}, i.e., whether every element of @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4524 also appears in @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4525 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527 @node Association Lists, , Lists as Sets, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528 @section Association Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 An @dfn{association list} is a list representing a mapping from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532 one set of values to another; any list whose elements are cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533 cells is an association list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 @defun assoc* item a-list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536 This function searches the association list @var{a-list} for an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 element whose @code{car} matches (in the sense of @code{:test},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 @code{:test-not}, and @code{:key}, or by comparison with @code{eql})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4539 a given @var{item}. It returns the matching element, if any,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4540 otherwise @code{nil}. It ignores elements of @var{a-list} which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4541 are not cons cells. (This corresponds to the behavior of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4542 @code{assq} and @code{assoc} in Emacs Lisp; Common Lisp's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4543 @code{assoc} ignores @code{nil}s but considers any other non-cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544 elements of @var{a-list} to be an error.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4545 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4547 @defun rassoc* item a-list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 This function searches for an element whose @code{cdr} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549 @var{item}. If @var{a-list} represents a mapping, this applies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 the inverse of the mapping to @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 @defun rassoc item a-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4554 This function searches like @code{rassoc*} with a @code{:test}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4555 argument of @code{equal}. It is analogous to Emacs Lisp's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4556 standard @code{assoc} function, which derives from the MacLisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4557 rather than the Common Lisp tradition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4558 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4559
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4560 @findex assoc-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4561 @findex assoc-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4562 @findex rassoc-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4563 @findex rassoc-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4564 The @code{assoc-if}, @code{assoc-if-not}, @code{rassoc-if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4565 and @code{rassoc-if-not} functions are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4567 Two simple functions for constructing association lists are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4569 @defun acons key value alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4570 This is equivalent to @code{(cons (cons @var{key} @var{value}) @var{alist})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4571 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4573 @defun pairlis keys values &optional alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574 This is equivalent to @code{(nconc (mapcar* 'cons @var{keys} @var{values})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4575 @var{alist})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4576 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4578 @node Hash Tables, Structures, Lists, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4579 @chapter Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4581 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4582 Hash tables are now implemented directly in the C code and documented in
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
4583 @ref{Hash Tables,,, lispref, XEmacs Lisp Reference Manual}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4585 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586 A @dfn{hash table} is a data structure that maps ``keys'' onto
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4587 ``values.'' Keys and values can be arbitrary Lisp data objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4588 Hash tables have the property that the time to search for a given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589 key is roughly constant; simpler data structures like association
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4590 lists take time proportional to the number of entries in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592 @defun make-hash-table @t{&key :test :size}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 This function creates and returns a hash-table object whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 function for comparing elements is @code{:test} (@code{eql}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595 by default), and which is allocated to fit about @code{:size}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4596 elements. The @code{:size} argument is purely advisory; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 table will stretch automatically if you store more elements in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4598 it. If @code{:size} is omitted, a reasonable default is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4600 Common Lisp allows only @code{eq}, @code{eql}, @code{equal},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 and @code{equalp} as legal values for the @code{:test} argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4602 In this package, any reasonable predicate function will work,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4603 though if you use something else you should check the details of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 the hashing function described below to make sure it is suitable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4605 for your predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4607 Some versions of Emacs (like XEmacs) include a built-in hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4608 table type; in these versions, @code{make-hash-table} with a test of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4609 @code{eq}, @code{eql}, or @code{equal} will use these built-in hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4610 tables. In all other cases, it will return a hash-table object which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4611 takes the form of a list with an identifying ``tag'' symbol at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4612 front. All of the hash table functions in this package can operate on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4613 both types of hash table; normally you will never know which type is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614 being used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 This function accepts the additional Common Lisp keywords
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4617 @code{:rehash-size} and @code{:rehash-threshold}, but it ignores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4618 their values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4621 @defun gethash key table &optional default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4622 This function looks up @var{key} in @var{table}. If @var{key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4623 exists in the table, in the sense that it matches any of the existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4624 keys according to the table's test function, then the associated value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4625 is returned. Otherwise, @var{default} (or @code{nil}) is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4626
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4627 To store new data in the hash table, use @code{setf} on a call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4628 @code{gethash}. If @var{key} already exists in the table, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4629 corresponding value is changed to the stored value. If @var{key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4630 does not already exist, a new entry is added to the table and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4631 table is reallocated to a larger size if necessary. The @var{default}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4632 argument is allowed but ignored in this case. The situation is
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
4633 exactly analogous to that of @code{get}; @pxref{Property Lists}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4634 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4636 @defun remhash key table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4637 This function removes the entry for @var{key} from @var{table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4638 If an entry was removed, it returns @code{t}. If @var{key} does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4639 not appear in the table, it does nothing and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4640 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4642 @defun clrhash table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4643 This function removes all the entries from @var{table}, leaving
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4644 an empty hash table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4645 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647 @defun maphash function table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 This function calls @var{function} for each entry in @var{table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 It passes two arguments to @var{function}, the key and the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650 of the given entry. The return value of @var{function} is ignored;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4651 @var{maphash} itself returns @code{nil}. @xref{Loop Facility}, for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652 an alternate way of iterating over hash tables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4655 @defun hash-table-count table This function returns the number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 entries in @var{table}. @strong{Warning:} The current implementation of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 XEmacs hash-tables does not decrement the stored @code{count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4658 when @code{remhash} removes an entry. Therefore, the return value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4659 this function is not dependable if you have used @code{remhash} on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4660 table and the table's test is @code{eq}, @code{eql}, or @code{equal}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4661 A slower, but reliable, way to count the entries is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4662 @code{(loop for x being the hash-keys of @var{table} count t)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4663 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 @defun hash-table-p object This function returns @code{t} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 @var{object} is a hash table, @code{nil} otherwise. It recognizes both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 types of hash tables (both XEmacs built-in tables and tables implemented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 with special lists.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671 Sometimes when dealing with hash tables it is useful to know the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 exact ``hash function'' that is used. This package implements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673 hash tables using Emacs Lisp ``obarrays,'' which are the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 data structure that Emacs Lisp uses to keep track of symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675 Each hash table includes an embedded obarray. Key values given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4676 to @code{gethash} are converted by various means into strings,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4677 which are then looked up in the obarray using @code{intern} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4678 @code{intern-soft}. The symbol, or ``bucket,'' corresponding to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679 a given key string includes as its @code{symbol-value} an association
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4680 list of all key-value pairs which hash to that string. Depending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4681 on the test function, it is possible for many entries to hash to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4682 the same bucket. For example, if the test is @code{eql}, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 symbol @code{foo} and two separately built strings @code{"foo"} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4684 create three entries in the same bucket. Search time is linear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685 within buckets, so hash tables will be most effective if you arrange
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686 not to store too many things that hash the same.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688 The following algorithm is used to convert Lisp objects to hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689 strings:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 Strings are used directly as hash strings. (However, if the test
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4694 function is @code{equalp}, strings are @code{downcase}d first.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4696 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697 Symbols are hashed according to their @code{symbol-name}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4699 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700 Integers are hashed into one of 16 buckets depending on their value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4701 modulo 16. Floating-point numbers are truncated to integers and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702 hashed modulo 16.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4704 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4705 Cons cells are hashed according to their @code{car}s; nonempty vectors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706 are hashed according to their first element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 All other types of objects hash into a single bucket named @code{"*"}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 Thus, for example, searching among many buffer objects in a hash table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714 will devolve to a (still fairly fast) linear-time search through a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715 single bucket, whereas searching for different symbols will be very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716 fast since each symbol will, in general, hash into its own bucket.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 The size of the obarray in a hash table is automatically adjusted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719 as the number of elements increases.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4721 As a special case, @code{make-hash-table} with a @code{:size} argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4722 of 0 or 1 will create a hash-table object that uses a single association
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4723 list rather than an obarray of many lists. For very small tables this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724 structure will be more efficient since lookup does not require
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4725 converting the key to a string or looking it up in an obarray.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 However, such tables are guaranteed to take time proportional to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 their size to do a search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 @chapno=18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734 @node Structures, Assertions, Hash Tables, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735 @chapter Structures
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 The Common Lisp @dfn{structure} mechanism provides a general way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 to define data types similar to C's @code{struct} types. A
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 structure is a Lisp object containing some number of @dfn{slots},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741 each of which can hold any Lisp data object. Functions are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 provided for accessing and setting the slots, creating or copying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 structure objects, and recognizing objects of a particular structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744 type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 In true Common Lisp, each structure type is a new type distinct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4747 from all existing Lisp types. Since the underlying Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748 system provides no way to create new distinct types, this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749 implements structures as vectors (or lists upon request) with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750 special ``tag'' symbol to identify them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 @defspec defstruct name slots@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4753 The @code{defstruct} form defines a new structure type called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 @var{name}, with the specified @var{slots}. (The @var{slots}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 may begin with a string which documents the structure type.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756 In the simplest case, @var{name} and each of the @var{slots}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757 are symbols. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 (defstruct person name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 defines a struct type called @code{person} which contains three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 slots. Given a @code{person} object @var{p}, you can access those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4766 slots by calling @code{(person-name @var{p})}, @code{(person-age @var{p})},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4767 and @code{(person-sex @var{p})}. You can also change these slots by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768 using @code{setf} on any of these place forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 (incf (person-age birthday-boy))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 You can create a new @code{person} by calling @code{make-person},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 which takes keyword arguments @code{:name}, @code{:age}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776 @code{:sex} to specify the initial values of these slots in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 new object. (Omitting any of these arguments leaves the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778 slot ``undefined,'' according to the Common Lisp standard; in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779 Lisp, such uninitialized slots are filled with @code{nil}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 Given a @code{person}, @code{(copy-person @var{p})} makes a new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4782 object of the same type whose slots are @code{eq} to those of @var{p}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 Given any Lisp object @var{x}, @code{(person-p @var{x})} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 true if @var{x} looks like a @code{person}, false otherwise. (Again,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786 in Common Lisp this predicate would be exact; in Emacs Lisp the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4787 best it can do is verify that @var{x} is a vector of the correct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788 length which starts with the correct tag symbol.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 Accessors like @code{person-name} normally check their arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 (effectively using @code{person-p}) and signal an error if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792 argument is the wrong type. This check is affected by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 @code{(optimize (safety @dots{}))} declarations. Safety level 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 the default, uses a somewhat optimized check that will detect all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 incorrect arguments, but may use an uninformative error message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 (e.g., ``expected a vector'' instead of ``expected a @code{person}'').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 Safety level 0 omits all checks except as provided by the underlying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4798 @code{aref} call; safety levels 2 and 3 do rigorous checking that will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 always print a descriptive error message for incorrect inputs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800 @xref{Declarations}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 (setq dave (make-person :name "Dave" :sex 'male))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 @result{} [cl-struct-person "Dave" nil male]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 (setq other (copy-person dave))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 @result{} [cl-struct-person "Dave" nil male]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 (eq dave other)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 (eq (person-name dave) (person-name other))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 (person-p dave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4813 (person-p [1 2 3 4])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 (person-p "Bogus")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 (person-p '[cl-struct-person counterfeit person object])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4818 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4821 In general, @var{name} is either a name symbol or a list of a name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 symbol followed by any number of @dfn{struct options}; each @var{slot}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4823 is either a slot symbol or a list of the form @samp{(@var{slot-name}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 @var{default-value} @var{slot-options}@dots{})}. The @var{default-value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4825 is a Lisp form which is evaluated any time an instance of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826 structure type is created without specifying that slot's value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828 Common Lisp defines several slot options, but the only one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 implemented in this package is @code{:read-only}. A non-@code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4830 value for this option means the slot should not be @code{setf}-able;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4831 the slot's value is determined when the object is created and does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832 not change afterward.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 (defstruct person
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 (name nil :read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 age
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 (sex 'unknown))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841 Any slot options other than @code{:read-only} are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843 For obscure historical reasons, structure options take a different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 form than slot options. A structure option is either a keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 symbol, or a list beginning with a keyword symbol possibly followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 by arguments. (By contrast, slot options are key-value pairs not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847 enclosed in lists.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4849 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 (defstruct (person (:constructor create-person)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851 (:type list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4852 :named)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856 The following structure options are recognized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4858 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4859 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4860 @itemmax=0 in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 @advance@leftskip-.5@tableindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4863 @item :conc-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4864 The argument is a symbol whose print name is used as the prefix for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865 the names of slot accessor functions. The default is the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4866 the struct type followed by a hyphen. The option @code{(:conc-name p-)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 would change this prefix to @code{p-}. Specifying @code{nil} as an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 argument means no prefix, so that the slot names themselves are used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869 to name the accessor functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4870
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 @item :constructor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 In the simple case, this option takes one argument which is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 alternate name to use for the constructor function. The default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874 is @code{make-@var{name}}, e.g., @code{make-person}. The above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 example changes this to @code{create-person}. Specifying @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 as an argument means that no standard constructor should be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877 generated at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 In the full form of this option, the constructor name is followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 by an arbitrary argument list. @xref{Program Structure}, for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 description of the format of Common Lisp argument lists. All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 options, such as @code{&rest} and @code{&key}, are supported.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4883 The argument names should match the slot names; each slot is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4884 initialized from the corresponding argument. Slots whose names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 do not appear in the argument list are initialized based on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 @var{default-value} in their slot descriptor. Also, @code{&optional}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887 and @code{&key} arguments which don't specify defaults take their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888 defaults from the slot descriptor. It is legal to include arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4889 which don't correspond to slot names; these are useful if they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4890 referred to in the defaults for optional, keyword, or @code{&aux}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891 arguments which @emph{do} correspond to slots.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 You can specify any number of full-format @code{:constructor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 options on a structure. The default constructor is still generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895 as well unless you disable it with a simple-format @code{:constructor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896 option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4899 (defstruct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4900 (person
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 (:constructor nil) ; no default constructor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4902 (:constructor new-person (name sex &optional (age 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4903 (:constructor new-hound (&key (name "Rover")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4904 (dog-years 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4905 &aux (age (* 7 dog-years))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 (sex 'canine))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 The first constructor here takes its arguments positionally rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 than by keyword. (In official Common Lisp terminology, constructors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912 that work By Order of Arguments instead of by keyword are called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913 ``BOA constructors.'' No, I'm not making this up.) For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4914 @code{(new-person "Jane" 'female)} generates a person whose slots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4915 are @code{"Jane"}, 0, and @code{female}, respectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4916
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4917 The second constructor takes two keyword arguments, @code{:name},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4918 which initializes the @code{name} slot and defaults to @code{"Rover"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4919 and @code{:dog-years}, which does not itself correspond to a slot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4920 but which is used to initialize the @code{age} slot. The @code{sex}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4921 slot is forced to the symbol @code{canine} with no syntax for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922 overriding it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4923
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4924 @item :copier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4925 The argument is an alternate name for the copier function for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4926 this type. The default is @code{copy-@var{name}}. @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4927 means not to generate a copier function. (In this implementation,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4928 all copier functions are simply synonyms for @code{copy-sequence}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4929
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4930 @item :predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4931 The argument is an alternate name for the predicate which recognizes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4932 objects of this type. The default is @code{@var{name}-p}. @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4933 means not to generate a predicate function. (If the @code{:type}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4934 option is used without the @code{:named} option, no predicate is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4935 ever generated.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4937 In true Common Lisp, @code{typep} is always able to recognize a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4938 structure object even if @code{:predicate} was used. In this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4939 package, @code{typep} simply looks for a function called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4940 @code{@var{typename}-p}, so it will work for structure types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4941 only if they used the default predicate name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4943 @item :include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 This option implements a very limited form of C++-style inheritance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4945 The argument is the name of another structure type previously
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4946 created with @code{defstruct}. The effect is to cause the new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4947 structure type to inherit all of the included structure's slots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4948 (plus, of course, any new slots described by this struct's slot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4949 descriptors). The new structure is considered a ``specialization''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950 of the included one. In fact, the predicate and slot accessors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951 for the included type will also accept objects of the new type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4953 If there are extra arguments to the @code{:include} option after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4954 the included-structure name, these options are treated as replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955 slot descriptors for slots in the included structure, possibly with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956 modified default values. Borrowing an example from Steele:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4958 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4959 (defstruct person name (age 0) sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4960 @result{} person
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4961 (defstruct (astronaut (:include person (age 45)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4962 helmet-size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4963 (favorite-beverage 'tang))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964 @result{} astronaut
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4966 (setq joe (make-person :name "Joe"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4967 @result{} [cl-struct-person "Joe" 0 nil]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968 (setq buzz (make-astronaut :name "Buzz"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4969 @result{} [cl-struct-astronaut "Buzz" 45 nil nil tang]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4971 (list (person-p joe) (person-p buzz))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4972 @result{} (t t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973 (list (astronaut-p joe) (astronaut-p buzz))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4974 @result{} (nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4976 (person-name buzz)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4977 @result{} "Buzz"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978 (astronaut-name joe)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 @result{} error: "astronaut-name accessing a non-astronaut"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982 Thus, if @code{astronaut} is a specialization of @code{person},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983 then every @code{astronaut} is also a @code{person} (but not the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 other way around). Every @code{astronaut} includes all the slots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 of a @code{person}, plus extra slots that are specific to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 astronauts. Operations that work on people (like @code{person-name})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987 work on astronauts just like other people.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989 @item :print-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 In full Common Lisp, this option allows you to specify a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 which is called to print an instance of the structure type. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 Emacs Lisp system offers no hooks into the Lisp printer which would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 allow for such a feature, so this package simply ignores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994 @code{:print-function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 @item :type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4997 The argument should be one of the symbols @code{vector} or @code{list}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4998 This tells which underlying Lisp data type should be used to implement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4999 the new structure type. Vectors are used by default, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 @code{(:type list)} will cause structure objects to be stored as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5001 lists instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003 The vector representation for structure objects has the advantage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 that all structure slots can be accessed quickly, although creating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5005 vectors is a bit slower in Emacs Lisp. Lists are easier to create,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006 but take a relatively long time accessing the later slots.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5008 @item :named
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5009 This option, which takes no arguments, causes a characteristic ``tag''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5010 symbol to be stored at the front of the structure object. Using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5011 @code{:type} without also using @code{:named} will result in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5012 structure type stored as plain vectors or lists with no identifying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5013 features.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 The default, if you don't specify @code{:type} explicitly, is to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5016 use named vectors. Therefore, @code{:named} is only useful in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017 conjunction with @code{:type}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5020 (defstruct (person1) name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021 (defstruct (person2 (:type list) :named) name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5022 (defstruct (person3 (:type list)) name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5024 (setq p1 (make-person1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5025 @result{} [cl-struct-person1 nil nil nil]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5026 (setq p2 (make-person2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5027 @result{} (person2 nil nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5028 (setq p3 (make-person3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5029 @result{} (nil nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5031 (person1-p p1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5032 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5033 (person2-p p2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5034 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5035 (person3-p p3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 @result{} error: function person3-p undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5037 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5039 Since unnamed structures don't have tags, @code{defstruct} is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5040 able to make a useful predicate for recognizing them. Also,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5041 accessors like @code{person3-name} will be generated but they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5042 will not be able to do any type checking. The @code{person3-name}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 function, for example, will simply be a synonym for @code{car} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044 this case. By contrast, @code{person2-name} is able to verify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 that its argument is indeed a @code{person2} object before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046 proceeding.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5047
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 @item :initial-offset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 The argument must be a nonnegative integer. It specifies a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 number of slots to be left ``empty'' at the front of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 structure. If the structure is named, the tag appears at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5052 specified position in the list or vector; otherwise, the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 slot appears at that position. Earlier positions are filled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 with @code{nil} by the constructors and ignored otherwise. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055 the type @code{:include}s another type, then @code{:initial-offset}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056 specifies a number of slots to be skipped between the last slot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 of the included type and the first new slot.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 Except as noted, the @code{defstruct} facility of this package is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062 entirely compatible with that of Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 @chapno=23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 @node Assertions, Efficiency Concerns, Structures, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069 @chapter Assertions and Errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072 This section describes two macros that test @dfn{assertions}, i.e.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 conditions which must be true if the program is operating correctly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 Assertions never add to the behavior of a Lisp program; they simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075 make ``sanity checks'' to make sure everything is as it should be.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077 If the optimization property @code{speed} has been set to 3, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 @code{safety} is less than 3, then the byte-compiler will optimize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5079 away the following assertions. Because assertions might be optimized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5080 away, it is a bad idea for them to include side-effects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5082 @defspec assert test-form [show-args string args@dots{}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5083 This form verifies that @var{test-form} is true (i.e., evaluates to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5084 a non-@code{nil} value). If so, it returns @code{nil}. If the test
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085 is not satisfied, @code{assert} signals an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087 A default error message will be supplied which includes @var{test-form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5088 You can specify a different error message by including a @var{string}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089 argument plus optional extra arguments. Those arguments are simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090 passed to @code{error} to signal the error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 If the optional second argument @var{show-args} is @code{t} instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5093 of @code{nil}, then the error message (with or without @var{string})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5094 will also include all non-constant arguments of the top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5095 @var{form}. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 (assert (> x 10) t "x is too small: %d")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5100
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5101 This usage of @var{show-args} is a change to Common Lisp. In
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 true Common Lisp, the second argument gives a list of @var{places}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5103 which can be @code{setf}'d by the user before continuing from the
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5104 error.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5106
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5107 @defspec check-type place type &optional string
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5108 This form verifies that @var{place} evaluates to a value of type
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5109 @var{type}. If so, it returns @code{nil}. If not, @code{check-type}
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5110 signals a continuable @code{wrong-type-argument} error. The default
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5111 error message lists the erroneous value along with @var{type} and
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5112 @var{place} themselves. If @var{string} is specified, it is included in
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5113 the error message in place of @var{type}. For example:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5115 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5116 (check-type x (integer 1 *) "a positive integer")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 @xref{Type Predicates}, for a description of the type specifiers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120 that may be used for @var{type}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5121
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5122 Note that as in Common Lisp, the first argument to @code{check-type}
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5123 should be a @var{place} suitable for use by @code{setf}, because
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5124 @code{check-type} signals a continuable error that allows the user to
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5125 modify @var{place}, most simply by returning a value from the debugger.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128 The following error-related macro is also defined:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 @defspec ignore-errors forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5131 This executes @var{forms} exactly like a @code{progn}, except that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132 errors are ignored during the @var{forms}. More precisely, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5133 an error is signalled then @code{ignore-errors} immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 aborts execution of the @var{forms} and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5135 If the @var{forms} complete successfully, @code{ignore-errors}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136 returns the result of the last @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5137 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5139 @node Efficiency Concerns, Common Lisp Compatibility, Assertions, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5140 @appendix Efficiency Concerns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142 @appendixsec Macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 Many of the advanced features of this package, such as @code{defun*},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5146 @code{loop}, and @code{setf}, are implemented as Lisp macros. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 byte-compiled code, these complex notations will be expanded into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5148 equivalent Lisp code which is simple and efficient. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5149 the forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5151 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5152 (incf i n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5153 (push x (car p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5154 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157 are expanded at compile-time to the Lisp forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5159 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 (setq i (+ i n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161 (setcar p (cons x (car p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165 which are the most efficient ways of doing these respective operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 in Lisp. Thus, there is no performance penalty for using the more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167 readable @code{incf} and @code{push} forms in your compiled code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 @emph{Interpreted} code, on the other hand, must expand these macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170 every time they are executed. For this reason it is strongly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 recommended that code making heavy use of macros be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 (The features labelled ``Special Form'' instead of ``Function'' in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173 this manual are macros.) A loop using @code{incf} a hundred times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174 will execute considerably faster if compiled, and will also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5175 garbage-collect less because the macro expansion will not have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176 to be generated, used, and thrown away a hundred times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5178 You can find out how a macro expands by using the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179 @code{cl-prettyexpand} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 @defun cl-prettyexpand form &optional full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 This function takes a single Lisp form as an argument and inserts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5183 a nicely formatted copy of it in the current buffer (which must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 in Lisp mode so that indentation works properly). It also expands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5185 all Lisp macros which appear in the form. The easiest way to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5186 this function is to go to the @code{*scratch*} buffer and type, say,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 (cl-prettyexpand '(loop for x below 10 collect x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5193 and type @kbd{C-x C-e} immediately after the closing parenthesis;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5194 the expansion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5196 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5197 (block nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5198 (let* ((x 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5199 (G1004 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5200 (while (< x 10)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5201 (setq G1004 (cons x G1004))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5202 (setq x (+ x 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5203 (nreverse G1004)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5204 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5206 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5207 will be inserted into the buffer. (The @code{block} macro is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5208 expanded differently in the interpreter and compiler, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5209 @code{cl-prettyexpand} just leaves it alone. The temporary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5210 variable @code{G1004} was created by @code{gensym}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5212 If the optional argument @var{full} is true, then @emph{all}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5213 macros are expanded, including @code{block}, @code{eval-when},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5214 and compiler macros. Expansion is done as if @var{form} were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5215 a top-level form in a file being compiled. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5217 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5218 (cl-prettyexpand '(pushnew 'x list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5219 @print{} (setq list (adjoin 'x list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5220 (cl-prettyexpand '(pushnew 'x list) t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5221 @print{} (setq list (if (memq 'x list) list (cons 'x list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5222 (cl-prettyexpand '(caddr (member* 'a list)) t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5223 @print{} (car (cdr (cdr (memq 'a list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5224 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5226 Note that @code{adjoin}, @code{caddr}, and @code{member*} all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5227 have built-in compiler macros to optimize them in common cases.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5228 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5230 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5231 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5233 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5234 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235 @appendixsec Error Checking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5237 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5238 Common Lisp compliance has in general not been sacrificed for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5239 sake of efficiency. A few exceptions have been made for cases
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5240 where substantial gains were possible at the expense of marginal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5241 incompatibility. One example is the use of @code{memq} (which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5242 treated very efficiently by the byte-compiler) to scan for keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5243 arguments; this can become confused in rare cases when keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5244 symbols are used as both keywords and data values at once. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5245 is extremely unlikely to occur in practical code, and the use of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5246 @code{memq} allows functions with keyword arguments to be nearly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5247 as fast as functions that use @code{&optional} arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5249 The Common Lisp standard (as embodied in Steele's book) uses the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5250 phrase ``it is an error if'' to indicate a situation which is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5251 supposed to arise in complying programs; implementations are strongly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5252 encouraged but not required to signal an error in these situations.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5253 This package sometimes omits such error checking in the interest of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5254 compactness and efficiency. For example, @code{do} variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5255 specifiers are supposed to be lists of one, two, or three forms;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5256 extra forms are ignored by this package rather than signalling a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5257 syntax error. The @code{endp} function is simply a synonym for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5258 @code{null} in this package. Functions taking keyword arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5259 will accept an odd number of arguments, treating the trailing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5260 keyword as if it were followed by the value @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5262 Argument lists (as processed by @code{defun*} and friends)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5263 @emph{are} checked rigorously except for the minor point just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5264 mentioned; in particular, keyword arguments are checked for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5265 validity, and @code{&allow-other-keys} and @code{:allow-other-keys}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5266 are fully implemented. Keyword validity checking is slightly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5267 time consuming (though not too bad in byte-compiled code);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5268 you can use @code{&allow-other-keys} to omit this check. Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5269 defined in this package such as @code{find} and @code{member*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5270 do check their keyword arguments for validity.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5272 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5273 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5276 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277 @appendixsec Optimizing Compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5279 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5280 The byte-compiler that comes with Emacs 18 normally fails to expand
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5281 macros that appear in top-level positions in the file (i.e., outside
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 of @code{defun}s or other enclosing forms). This would have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5283 disastrous consequences to programs that used such top-level macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5284 as @code{defun*}, @code{eval-when}, and @code{defstruct}. To
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5285 work around this problem, the @dfn{CL} package patches the Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5286 18 compiler to expand top-level macros. This patch will apply to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5287 your own macros, too, if they are used in a top-level context.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 The patch will not harm versions of the Emacs 18 compiler which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 have already had a similar patch applied, nor will it affect the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5290 optimizing Emacs 19 byte-compiler written by Jamie Zawinski and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5291 Hallvard Furuseth. The patch is applied to the byte compiler's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5292 code in Emacs' memory, @emph{not} to the @file{bytecomp.elc} file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5293 stored on disk.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5295 The Emacs 19 compiler (for Emacs 18) is available from various
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5296 Emacs Lisp archive sites such as @code{archive.cis.ohio-state.edu}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297 Its use is highly recommended; many of the Common Lisp macros emit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298 code which can be improved by optimization. In particular,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 @code{block}s (whether explicit or implicit in constructs like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5300 @code{defun*} and @code{loop}) carry a fair run-time penalty; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 optimizing compiler removes @code{block}s which are not actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302 referenced by @code{return} or @code{return-from} inside the block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304 @node Common Lisp Compatibility, Old CL Compatibility, Efficiency Concerns, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305 @appendix Common Lisp Compatibility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5307 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5308 Following is a list of all known incompatibilities between this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5309 package and Common Lisp as documented in Steele (2nd edition).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 Certain function names, such as @code{member}, @code{assoc}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312 @code{floor}, were already taken by (incompatible) Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 functions; this package appends @samp{*} to the names of its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5314 Common Lisp versions of these functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5316 The word @code{defun*} is required instead of @code{defun} in order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317 to use extended Common Lisp argument lists in a function. Likewise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5318 @code{defmacro*} and @code{function*} are versions of those forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5319 which understand full-featured argument lists. The @code{&whole}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5320 keyword does not work in @code{defmacro} argument lists (except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5321 inside recursive argument lists).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5323 In order to allow an efficient implementation, keyword arguments use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5324 a slightly cheesy parser which may be confused if a keyword symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5325 is passed as the @emph{value} of another keyword argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5326 (Specifically, @code{(memq :@var{keyword} @var{rest-of-arguments})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5327 is used to scan for @code{:@var{keyword}} among the supplied
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5328 keyword arguments.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5330 The @code{eql} and @code{equal} predicates do not distinguish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5331 between IEEE floating-point plus and minus zero. The @code{equalp}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5332 predicate has several differences with Common Lisp; @pxref{Predicates}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5334 The @code{setf} mechanism is entirely compatible, except that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5335 setf-methods return a list of five values rather than five
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5336 values directly. Also, the new ``@code{setf} function'' concept
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5337 (typified by @code{(defun (setf foo) @dots{})}) is not implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5339 The @code{do-all-symbols} form is the same as @code{do-symbols}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5340 with no @var{obarray} argument. In Common Lisp, this form would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5341 iterate over all symbols in all packages. Since Emacs obarrays
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5342 are not a first-class package mechanism, there is no way for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5343 @code{do-all-symbols} to locate any but the default obarray.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5345 The @code{loop} macro is complete except that @code{loop-finish}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5346 and type specifiers are unimplemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5348 The multiple-value return facility treats lists as multiple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5349 values, since Emacs Lisp cannot support multiple return values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5350 directly. The macros will be compatible with Common Lisp if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5351 @code{values} or @code{values-list} is always used to return to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5352 a @code{multiple-value-bind} or other multiple-value receiver;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5353 if @code{values} is used without @code{multiple-value-@dots{}}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5354 or vice-versa the effect will be different from Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5356 Many Common Lisp declarations are ignored, and others match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5357 the Common Lisp standard in concept but not in detail. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5358 example, local @code{special} declarations, which are purely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5359 advisory in Emacs Lisp, do not rigorously obey the scoping rules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5360 set down in Steele's book.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5362 The variable @code{*gensym-counter*} starts out with a pseudo-random
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5363 value rather than with zero. This is to cope with the fact that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5364 generated symbols become interned when they are written to and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5365 loaded back from a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5367 The @code{defstruct} facility is compatible, except that structures
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5368 are of type @code{:type vector :named} by default rather than some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5369 special, distinct type. Also, the @code{:type} slot option is ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5371 The second argument of @code{check-type} is treated differently.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5373 @node Old CL Compatibility, Porting Common Lisp, Common Lisp Compatibility, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5374 @appendix Old CL Compatibility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5376 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5377 Following is a list of all known incompatibilities between this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5378 and the older Quiroz @file{cl.el} package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5380 This package's emulation of multiple return values in functions is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5381 incompatible with that of the older package. That package attempted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5382 to come as close as possible to true Common Lisp multiple return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5383 values; unfortunately, it could not be 100% reliable and so was prone
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5384 to occasional surprises if used freely. This package uses a simpler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5385 method, namely replacing multiple values with lists of values, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5386 is more predictable though more noticeably different from Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5388 The @code{defkeyword} form and @code{keywordp} function are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5389 implemented in this package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 The @code{member}, @code{floor}, @code{ceiling}, @code{truncate},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5392 @code{round}, @code{mod}, and @code{rem} functions are suffixed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 by @samp{*} in this package to avoid collision with existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5394 functions in Emacs 18 or Emacs 19. The older package simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5395 redefined these functions, overwriting the built-in meanings and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5396 causing serious portability problems with Emacs 19. (Some more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5397 recent versions of the Quiroz package changed the names to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5398 @code{cl-member}, etc.; this package defines the latter names as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5399 aliases for @code{member*}, etc.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5401 Certain functions in the old package which were buggy or inconsistent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5402 with the Common Lisp standard are incompatible with the conforming
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5403 versions in this package. For example, @code{eql} and @code{member}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 were synonyms for @code{eq} and @code{memq} in that package, @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 failed to preserve correct order of evaluation of its arguments, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 Finally, unlike the older package, this package is careful to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 prefix all of its internal names with @code{cl-}. Except for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409 few functions which are explicitly defined as additional features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410 (such as @code{floatp-safe} and @code{letf}), this package does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411 export any non-@samp{cl-} symbols which are not also part of Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5412 Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5413
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5419 @appendixsec The @code{cl-compat} package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422 The @dfn{CL} package includes emulations of some features of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5423 old @file{cl.el}, in the form of a compatibility package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 @code{cl-compat}. To use it, put @code{(require 'cl-compat)} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5425 your program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 The old package defined a number of internal routines without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428 @code{cl-} prefixes or other annotations. Call to these routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 may have crept into existing Lisp code. @code{cl-compat}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5430 provides emulations of the following internal routines:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 @code{pair-with-newsyms}, @code{zip-lists}, @code{unzip-lists},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5432 @code{reassemble-arglists}, @code{duplicate-symbols-p},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433 @code{safe-idiv}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5435 Some @code{setf} forms translated into calls to internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 functions that user code might call directly. The functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5437 @code{setnth}, @code{setnthcdr}, and @code{setelt} fall in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5438 this category; they are defined by @code{cl-compat}, but the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5439 best fix is to change to use @code{setf} properly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5441 The @code{cl-compat} file defines the keyword functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442 @code{keywordp}, @code{keyword-of}, and @code{defkeyword},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443 which are not defined by the new @dfn{CL} package because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 use of keywords as data is discouraged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446 The @code{build-klist} mechanism for parsing keyword arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5447 is emulated by @code{cl-compat}; the @code{with-keyword-args}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5448 macro is not, however, and in any case it's best to change to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5449 use the more natural keyword argument processing offered by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5450 @code{defun*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5452 Multiple return values are treated differently by the two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5453 Common Lisp packages. The old package's method was more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5454 compatible with true Common Lisp, though it used heuristics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5455 that caused it to report spurious multiple return values in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5456 certain cases. The @code{cl-compat} package defines a set
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5457 of multiple-value macros that are compatible with the old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5458 CL package; again, they are heuristic in nature, but they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5459 are guaranteed to work in any case where the old package's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5460 macros worked. To avoid name collision with the ``official''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461 multiple-value facilities, the ones in @code{cl-compat} have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462 capitalized names: @code{Values}, @code{Values-list},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5463 @code{Multiple-value-bind}, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5464
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5465 The functions @code{cl-floor}, @code{cl-ceiling}, @code{cl-truncate},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5466 and @code{cl-round} are defined by @code{cl-compat} to use the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5467 old-style multiple-value mechanism, just as they did in the old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5468 package. The newer @code{floor*} and friends return their two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469 results in a list rather than as multiple values. Note that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5470 older versions of the old package used the unadorned names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5471 @code{floor}, @code{ceiling}, etc.; @code{cl-compat} cannot use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5472 these names because they conflict with Emacs 19 built-ins.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5474 @node Porting Common Lisp, Function Index, Old CL Compatibility, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5475 @appendix Porting Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5477 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5478 This package is meant to be used as an extension to Emacs Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 not as an Emacs implementation of true Common Lisp. Some of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480 remaining differences between Emacs Lisp and Common Lisp make it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481 difficult to port large Common Lisp applications to Emacs. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5482 one, some of the features in this package are not fully compliant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5483 with ANSI or Steele; @pxref{Common Lisp Compatibility}. But there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5484 are also quite a few features that this package does not provide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5485 at all. Here are some major omissions that you will want watch out
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5486 for when bringing Common Lisp code into Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5489 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5490 Case-insensitivity. Symbols in Common Lisp are case-insensitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491 by default. Some programs refer to a function or variable as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5492 @code{foo} in one place and @code{Foo} or @code{FOO} in another.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5493 Emacs Lisp will treat these as three distinct symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5495 Some Common Lisp code is written in all upper-case. While Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5496 is happy to let the program's own functions and variables use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5497 this convention, calls to Lisp builtins like @code{if} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 @code{defun} will have to be changed to lower-case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5500 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5501 Lexical scoping. In Common Lisp, function arguments and @code{let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502 bindings apply only to references physically within their bodies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 (or within macro expansions in their bodies). Emacs Lisp, by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5504 contrast, uses @dfn{dynamic scoping} wherein a binding to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5505 variable is visible even inside functions called from the body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5507 Variables in Common Lisp can be made dynamically scoped by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5508 declaring them @code{special} or using @code{defvar}. In Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 Lisp it is as if all variables were declared @code{special}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511 Often you can use code that was written for lexical scoping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5512 even in a dynamically scoped Lisp, but not always. Here is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513 an example of a Common Lisp code fragment that would fail in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5514 Emacs Lisp:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5516 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5517 (defun map-odd-elements (func list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5518 (loop for x in list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5519 for flag = t then (not flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5520 collect (if flag x (funcall func x))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5522 (defun add-odd-elements (list x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5523 (map-odd-elements (function (lambda (a) (+ a x))) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5524 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5527 In Common Lisp, the two functions' usages of @code{x} are completely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5528 independent. In Emacs Lisp, the binding to @code{x} made by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5529 @code{add-odd-elements} will have been hidden by the binding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5530 in @code{map-odd-elements} by the time the @code{(+ a x)} function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 is called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5533 (This package avoids such problems in its own mapping functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5534 by using names like @code{cl-x} instead of @code{x} internally;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5535 as long as you don't use the @code{cl-} prefix for your own
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536 variables no collision can occur.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5538 @xref{Lexical Bindings}, for a description of the @code{lexical-let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539 form which establishes a Common Lisp-style lexical binding, and some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5540 examples of how it differs from Emacs' regular @code{let}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543 Common Lisp allows the shorthand @code{#'x} to stand for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5544 @code{(function x)}, just as @code{'x} stands for @code{(quote x)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 In Common Lisp, one traditionally uses @code{#'} notation when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546 referring to the name of a function. In Emacs Lisp, it works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547 just as well to use a regular quote:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5549 @example
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5550 (loop for x in y by #'cddr collect (mapcar #'plusp x)) ; Common Lisp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5551 (loop for x in y by 'cddr collect (mapcar 'plusp x)) ; Emacs Lisp
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5554 When @code{#'} introduces a @code{lambda} form, it is best to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5555 write out @code{(function ...)} longhand in Emacs Lisp. You can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5556 use a regular quote, but then the byte-compiler won't know that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5557 the @code{lambda} expression is code that can be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5559 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5560 (mapcar #'(lambda (x) (* x 2)) list) ; Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5561 (mapcar (function (lambda (x) (* x 2))) list) ; Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5562 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5563
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5564 XEmacs supports @code{#'} notation starting with version 19.8.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5566 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5567 Reader macros. Common Lisp includes a second type of macro that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568 works at the level of individual characters. For example, Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5569 Lisp implements the quote notation by a reader macro called @code{'},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5570 whereas Emacs Lisp's parser just treats quote as a special case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5571 Some Lisp packages use reader macros to create special syntaxes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5572 for themselves, which the Emacs parser is incapable of reading.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5574 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5575 Other syntactic features. Common Lisp provides a number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5576 notations beginning with @code{#} that the Emacs Lisp parser
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5577 won't understand. For example, @samp{#| ... |#} is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5578 alternate comment notation, and @samp{#+lucid (foo)} tells
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 the parser to ignore the @code{(foo)} except in Lucid Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5580 Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5582 The number prefixes `#b', `#o', and `#x', however, are supported
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5583 by the Emacs Lisp parser to represent numbers in binary, octal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5584 and hexadecimal notation (or radix), just like in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5586 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5587 Packages. In Common Lisp, symbols are divided into @dfn{packages}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5588 Symbols that are Lisp built-ins are typically stored in one package;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5589 symbols that are vendor extensions are put in another, and each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5590 application program would have a package for its own symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5591 Certain symbols are ``exported'' by a package and others are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5592 internal; certain packages ``use'' or import the exported symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5593 of other packages. To access symbols that would not normally be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5594 visible due to this importing and exporting, Common Lisp provides
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5595 a syntax like @code{package:symbol} or @code{package::symbol}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5597 Emacs Lisp has a single namespace for all interned symbols, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5598 then uses a naming convention of putting a prefix like @code{cl-}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5599 in front of the name. Some Emacs packages adopt the Common Lisp-like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5600 convention of using @code{cl:} or @code{cl::} as the prefix.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5601 However, the Emacs parser does not understand colons and just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5602 treats them as part of the symbol name. Thus, while @code{mapcar}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5603 and @code{lisp:mapcar} may refer to the same symbol in Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5604 Lisp, they are totally distinct in Emacs Lisp. Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5605 programs which refer to a symbol by the full name sometimes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5606 and the short name other times will not port cleanly to Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5608 Emacs Lisp does have a concept of ``obarrays,'' which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5609 package-like collections of symbols, but this feature is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5610 strong enough to be used as a true package mechanism.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5611
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5612 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5613 Keywords. The notation @code{:test-not} in Common Lisp really
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5614 is a shorthand for @code{keyword:test-not}; keywords are just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5615 symbols in a built-in @code{keyword} package with the special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5616 property that all its symbols are automatically self-evaluating.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5617 Common Lisp programs often use keywords liberally to avoid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5618 having to use quotes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5620 In Emacs Lisp a keyword is just a symbol whose name begins with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5621 a colon; since the Emacs parser does not treat them specially,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5622 they have to be explicitly made self-evaluating by a statement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5623 like @code{(setq :test-not ':test-not)}. This package arranges
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5624 to execute such a statement whenever @code{defun*} or some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5625 other form sees a keyword being used as an argument. Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5626 Lisp code that assumes that a symbol @code{:mumble} will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5627 self-evaluating even though it was never introduced by a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5628 @code{defun*} will have to be fixed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5630 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5631 The @code{format} function is quite different between Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5632 Lisp and Emacs Lisp. It takes an additional ``destination''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5633 argument before the format string. A destination of @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5634 means to format to a string as in Emacs Lisp; a destination
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5635 of @code{t} means to write to the terminal (similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5636 @code{message} in Emacs). Also, format control strings are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5637 utterly different; @code{~} is used instead of @code{%} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5638 introduce format codes, and the set of available codes is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5639 much richer. There are no notations like @code{\n} for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5640 string literals; instead, @code{format} is used with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5641 ``newline'' format code, @code{~%}. More advanced formatting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5642 codes provide such features as paragraph filling, case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5643 conversion, and even loops and conditionals.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5645 While it would have been possible to implement most of Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5646 Lisp @code{format} in this package (under the name @code{format*},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5647 of course), it was not deemed worthwhile. It would have required
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5648 a huge amount of code to implement even a decent subset of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5649 @code{format*}, yet the functionality it would provide over
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5650 Emacs Lisp's @code{format} would rarely be useful.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5652 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5653 Vector constants use square brackets in Emacs Lisp, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5654 @code{#(a b c)} notation in Common Lisp. To further complicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5655 matters, Emacs 19 introduces its own @code{#(} notation for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5656 something entirely different---strings with properties.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5658 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5659 Characters are distinct from integers in Common Lisp. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5660 notation for character constants is also different: @code{#\A}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5661 instead of @code{?A}. Also, @code{string=} and @code{string-equal}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5662 are synonyms in Emacs Lisp whereas the latter is case-insensitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5663 in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5665 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5666 Data types. Some Common Lisp data types do not exist in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5667 Lisp. Rational numbers and complex numbers are not present,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5668 nor are large integers (all integers are ``fixnums''). All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5669 arrays are one-dimensional. There are no readtables or pathnames;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5670 streams are a set of existing data types rather than a new data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5671 type of their own. Hash tables, random-states, structures, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5672 packages (obarrays) are built from Lisp vectors or lists rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5673 than being distinct types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5675 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5676 The Common Lisp Object System (CLOS) is not implemented,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5677 nor is the Common Lisp Condition System.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5679 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5680 Common Lisp features that are completely redundant with Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5681 Lisp features of a different name generally have not been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5682 implemented. For example, Common Lisp writes @code{defconstant}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5683 where Emacs Lisp uses @code{defconst}. Similarly, @code{make-list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5684 takes its arguments in different ways in the two Lisps but does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5685 exactly the same thing, so this package has not bothered to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5686 implement a Common Lisp-style @code{make-list}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5688 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5689 A few more notable Common Lisp features not included in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5690 package: @code{compiler-let}, @code{tagbody}, @code{prog},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5691 @code{ldb/dpb}, @code{parse-integer}, @code{cerror}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5693 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5694 Recursion. While recursion works in Emacs Lisp just like it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5695 does in Common Lisp, various details of the Emacs Lisp system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5696 and compiler make recursion much less efficient than it is in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5697 most Lisps. Some schools of thought prefer to use recursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5698 in Lisp over other techniques; they would sum a list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5699 numbers using something like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5701 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5702 (defun sum-list (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5703 (if list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5704 (+ (car list) (sum-list (cdr list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5705 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5706 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5708 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5709 where a more iteratively-minded programmer might write one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5710 these forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5712 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5713 (let ((total 0)) (dolist (x my-list) (incf total x)) total)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5714 (loop for x in my-list sum x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5715 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5717 While this would be mainly a stylistic choice in most Common Lisps,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5718 in Emacs Lisp you should be aware that the iterative forms are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5719 much faster than recursion. Also, Lisp programmers will want to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5720 note that the current Emacs Lisp compiler does not optimize tail
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5721 recursion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5722 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5724 @node Function Index, Variable Index, Porting Common Lisp, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5725 @unnumbered Function Index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5727 @printindex fn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5729 @node Variable Index, , Function Index, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5730 @unnumbered Variable Index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5731
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5732 @printindex vr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5734 @contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5735 @bye