annotate man/cl.texi @ 4709:db7068430402

Add explicit GPL v2 or later notices to Bill Perry's code, where such notices are missing. This is done with Bill Perry's stated permission, in private email to me.
author Jerry James <james@xemacs.org>
date Mon, 05 Oct 2009 11:08:59 -0600
parents 8f1ee2d15784
children 755ae5b97edb
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
1353
b234386a35eb [xemacs-hg @ 2003-03-12 17:35:06 by adrian]
adrian
parents: 778
diff changeset
12 * Common Lisp: (cl). XEmacs Common Lisp emulation package.
428
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
1353
b234386a35eb [xemacs-hg @ 2003-03-12 17:35:06 by adrian]
adrian
parents: 778
diff changeset
15 This file documents the XEmacs Common Lisp emulation package.
428
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
4677
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1353
diff changeset
252 like @code{setelt} and @code{zip-lists}, and deprecated features
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 1353
diff changeset
253 like @code{defkeyword}. @xref{Old CL Compatibility}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 @node Installation, Naming Conventions, Organization, Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 @section Installation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 Installation of the @dfn{CL} package is simple: Just put the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 byte-compiled files @file{cl.elc}, @file{cl-extra.elc},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 @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
262 into a directory on your @code{load-path}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 There are no special requirements to compile this package:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 The files do not have to be loaded before they are compiled,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 nor do they need to be compiled in any particular order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 You may choose to put the files into your main @file{lisp/}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 directory, replacing the original @file{cl.el} file there. Or,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 you could put them into a directory that comes before @file{lisp/}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 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
272 effectively hidden.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 Also, format the @file{cl.texinfo} file and put the resulting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 Info files in the @file{info/} directory or another suitable place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 You may instead wish to leave this package's components all in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 their own directory, and then add this directory to your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 @code{load-path} and (Emacs 19 only) @code{Info-directory-list}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 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
281 package and its documentation are hidden.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 @node Naming Conventions, , Installation, Overview
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 @section Naming Conventions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 Except where noted, all functions defined by this package have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 same names and calling conventions as their Common Lisp counterparts.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 Following is a complete list of functions whose names were changed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 from Common Lisp, usually to avoid conflicts with Emacs. In each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 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
293 the Emacs name:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 defun* defsubst* defmacro* function*
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
297 member* assoc* rassoc* remove*
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
298 delete* mapcar* sort* floor*
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
299 ceiling* truncate* round* mod*
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
300 rem* random*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 Internal function and variable names in the package are prefixed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 by @code{cl-}. Here is a complete list of functions @emph{not}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 prefixed by @code{cl-} which were not taken from Common Lisp:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 member delete remove remq
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 rassoc floatp-safe lexical-let lexical-let*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 callf callf2 letf letf*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 defsubst* defalias add-hook eval-when-compile
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 (Most of these are Emacs 19 features provided to Emacs 18 users,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 or introduced, like @code{remq}, for reasons of symmetry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 with similar features.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 The following simple functions and macros are defined in @file{cl.el};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 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
321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 eql floatp-safe abs endp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 evenp oddp plusp minusp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 last butlast nbutlast caar .. cddddr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 list* ldiff rest first .. tenth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 member [1] copy-list subst mapcar* [2]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 adjoin [3] acons pairlis when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 unless pop [4] push [4] pushnew [3,4]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 incf [4] decf [4] proclaim declaim
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 add-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 [1] This is the Emacs 19-compatible function, not @code{member*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 [2] Only for one sequence argument or two list arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 [3] Only if @code{:test} is @code{eq}, @code{equal}, or unspecified,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 and @code{:key} is not used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 [4] Only when @var{place} is a plain variable name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 @chapno=4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 @node Program Structure, Predicates, Overview, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 @chapter Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 This section describes features of the @dfn{CL} package which have to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 do with programs as a whole: advanced argument lists for functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 and the @code{eval-when} construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 * Argument Lists:: `&key', `&aux', `defun*', `defmacro*'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 * Time of Evaluation:: The `eval-when' construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 * Function Aliases:: The `defalias' function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 @secno=1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 @node Argument Lists, Time of Evaluation, Program Structure, Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 @section Argument Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 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
374 the Common Lisp notation. As well as the familiar @code{&optional}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 and @code{&rest} markers, Common Lisp allows you to specify default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 values for optional arguments, and it provides the additional markers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 @code{&key} and @code{&aux}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 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
380 this package to implement Common Lisp argument lists seamlessly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 Instead, this package defines alternates for several Lisp forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 which you must use if you need Common Lisp argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 @defspec defun* name arglist body...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 This form is identical to the regular @code{defun} form, except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 that @var{arglist} is allowed to be a full Common Lisp argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 list. Also, the function body is enclosed in an implicit block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 called @var{name}; @pxref{Blocks and Exits}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 @defspec defsubst* name arglist body...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 This is just like @code{defun*}, except that the function that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 is defined is automatically proclaimed @code{inline}, i.e.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 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
395 This is analogous to the @code{defsubst} form in Emacs 19;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 @code{defsubst*} uses a different method (compiler macros) which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 works in all version of Emacs, and also generates somewhat more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 efficient inline expansions. In particular, @code{defsubst*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 arranges for the processing of keyword arguments, default values,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 etc., to be done at compile-time whenever possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 @defspec defmacro* name arglist body...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 This is identical to the regular @code{defmacro} form,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 except that @var{arglist} is allowed to be a full Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 argument list. The @code{&environment} keyword is supported as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 described in Steele. The @code{&whole} keyword is supported only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 within destructured lists (see below); top-level @code{&whole}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 cannot be implemented with the current Emacs Lisp interpreter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 The macro expander body is enclosed in an implicit block called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 @var{name}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 @defspec function* symbol-or-lambda
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 This is identical to the regular @code{function} form,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 except that if the argument is a @code{lambda} form then that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 form may use a full Common Lisp argument list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 Also, all forms (such as @code{defsetf} and @code{flet}) defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 in this package that include @var{arglist}s in their syntax allow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 full Common Lisp argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 Note that it is @emph{not} necessary to use @code{defun*} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 order to have access to most @dfn{CL} features in your function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 These features are always present; @code{defun*}'s only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 difference from @code{defun} is its more flexible argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 lists and its implicit block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 The full form of a Common Lisp argument list is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (@var{var}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 &optional (@var{var} @var{initform} @var{svar})...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 &rest @var{var}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 &key ((@var{keyword} @var{var}) @var{initform} @var{svar})...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 &aux (@var{var} @var{initform})...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 Each of the five argument list sections is optional. The @var{svar},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 @var{initform}, and @var{keyword} parts are optional; if they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 omitted, then @samp{(@var{var})} may be written simply @samp{@var{var}}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 The first section consists of zero or more @dfn{required} arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 These arguments must always be specified in a call to the function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 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
447 required arguments are concerned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 The second section consists of @dfn{optional} arguments. These
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 arguments may be specified in the function call; if they are not,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 @var{initform} specifies the default value used for the argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (No @var{initform} means to use @code{nil} as the default.) The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 @var{initform} is evaluated with the bindings for the preceding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 arguments already established; @code{(a &optional (b (1+ a)))}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 matches one or two arguments, with the second argument defaulting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 to one plus the first argument. If the @var{svar} is specified,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 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
458 argument was specified, or to @code{nil} if the argument was omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 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
460 function to tell whether it was called with no argument, or with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 the default value passed explicitly as an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 The third section consists of a single @dfn{rest} argument. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 more arguments were passed to the function than are accounted for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 by the required and optional arguments, those extra arguments are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 collected into a list and bound to the ``rest'' argument variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 Common Lisp's @code{&rest} is equivalent to that of Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 Common Lisp accepts @code{&body} as a synonym for @code{&rest} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 macro contexts; this package accepts it all the time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 The fourth section consists of @dfn{keyword} arguments. These
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 are optional arguments which are specified by name rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 positionally in the argument list. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (defun* foo (a &optional b &key c d (e 17)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 defines a function which may be called with one, two, or more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 arguments. The first two arguments are bound to @code{a} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 @code{b} in the usual way. The remaining arguments must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 pairs of the form @code{:c}, @code{:d}, or @code{:e} followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 by the value to be bound to the corresponding argument variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (Symbols whose names begin with a colon are called @dfn{keywords},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 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
487 @code{t}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 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
490 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
491 appears more than once in the function call, the first occurrence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 takes precedence over the later ones. Note that it is not possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 to specify keyword arguments without specifying the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 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
495 @code{b} to the keyword @code{:c}, then signal an error because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 @code{2} is not a valid keyword.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 If a @var{keyword} symbol is explicitly specified in the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 list as shown in the above diagram, then that keyword will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 used instead of just the variable name prefixed with a colon.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 You can specify a @var{keyword} symbol which does not begin with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 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
503 will have to quote them explicitly with an apostrophe in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 function call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 Ordinarily it is an error to pass an unrecognized keyword to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 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
508 Lisp to ignore unrecognized keywords, either by adding the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 marker @code{&allow-other-keys} after the keyword section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 of the argument list, or by specifying an @code{:allow-other-keys}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 argument in the call whose value is non-@code{nil}. If the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 function uses both @code{&rest} and @code{&key} at the same time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 the ``rest'' argument is bound to the keyword list as it appears
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 in the call. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 (defun* find-thing (thing &rest rest &key need &allow-other-keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (or (apply 'member* thing thing-list :allow-other-keys t rest)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (if need (error "Thing not found"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 This function takes a @code{:need} keyword argument, but also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 accepts other keyword arguments which are passed on to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 @code{member*} function. @code{allow-other-keys} is used to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 keep both @code{find-thing} and @code{member*} from complaining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 about each others' keywords in the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 As a (significant) performance optimization, this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 implements the scan for keyword arguments by calling @code{memq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 to search for keywords in a ``rest'' argument. Technically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 speaking, this is incorrect, since @code{memq} looks at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 odd-numbered values as well as the even-numbered keywords.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 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
535 as the @emph{value} of another keyword argument, where that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 keyword symbol happens to equal the name of a valid keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 argument of the same function, then the keyword parser will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 become confused. This minor bug can only affect you if you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 use keyword symbols as general-purpose data in your program;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 this practice is strongly discouraged in Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 The fifth section of the argument list consists of @dfn{auxiliary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 variables}. These are not really arguments at all, but simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 variables which are bound to @code{nil} or to the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 @var{initforms} during execution of the function. There is no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 difference between the following two functions, except for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 matter of stylistic taste:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (defun* foo (a b &aux (c (+ a b)) d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 @var{body})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (defun* foo (a b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (let ((c (+ a b)) d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 @var{body}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 Argument lists support @dfn{destructuring}. In Common Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 destructuring is only allowed with @code{defmacro}; this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 allows it with @code{defun*} and other argument lists as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 In destructuring, any argument variable (@var{var} in the above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 diagram) can be replaced by a list of variables, or more generally,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 a recursive argument list. The corresponding argument value must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 be a list whose elements match this recursive argument list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (defmacro* dolist ((var listform &optional resultform)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 &rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 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
574 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
575 list, they are stored in @code{body}. All features allowed in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 regular argument lists are allowed in these recursive argument lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 In addition, the clause @samp{&whole @var{var}} is allowed at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 front of a recursive argument list. It binds @var{var} to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 whole list being matched; thus @code{(&whole all a b)} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 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
581 @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
582 list itself. (Common Lisp allows @code{&whole} in top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 @code{defmacro} argument lists as well, but Emacs Lisp does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 support this usage.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 One last feature of destructuring is that the argument list may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 dotted, so that the argument list @code{(a b . c)} is functionally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 equivalent to @code{(a b &rest c)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 If the optimization quality @code{safety} is set to 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (@pxref{Declarations}), error checking for wrong number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 arguments and invalid keyword arguments is disabled. By default,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 argument lists are rigorously checked.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 @node Time of Evaluation, Function Aliases, Argument Lists, Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 @section Time of Evaluation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 Normally, the byte-compiler does not actually execute the forms in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 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
601 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
602 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
603 enclosed in a @code{defun} or other form). Sometimes, though, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 would like to have certain top-level forms evaluated at compile-time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 For example, the compiler effectively evaluates @code{defmacro} forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 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
607 macros that are defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 @defspec eval-when (situations...) forms...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 This form controls when the body @var{forms} are evaluated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 The @var{situations} list may contain any set of the symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 @code{compile}, @code{load}, and @code{eval} (or their long-winded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 ANSI equivalents, @code{:compile-toplevel}, @code{:load-toplevel},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 and @code{:execute}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 The @code{eval-when} form is handled differently depending on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 whether or not it is being compiled as a top-level form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 Specifically, it gets special treatment if it is being compiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 by a command such as @code{byte-compile-file} which compiles files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 or buffers of code, and it appears either literally at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 top level of the file or inside a top-level @code{progn}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 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
624 executed at compile-time if @code{compile} is in the @var{situations}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 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
626 at load-time) if @code{load} is in the @var{situations} list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 For non-compiled-top-level forms, only the @code{eval} situation is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 relevant. (This includes forms executed by the interpreter, forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 compiled with @code{byte-compile} rather than @code{byte-compile-file},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 and non-top-level forms.) The @code{eval-when} acts like a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 @code{progn} if @code{eval} is specified, and like @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (ignoring the body @var{forms}) if not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 The rules become more subtle when @code{eval-when}s are nested;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 consult Steele (second edition) for the gruesome details (and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 some gruesome examples).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 Some simple examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 ;; Top-level forms in foo.el:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 (eval-when (compile) (setq foo1 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 (eval-when (load) (setq foo2 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (eval-when (compile load) (setq foo3 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 (eval-when (eval) (setq foo4 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 (eval-when (eval compile) (setq foo5 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 (eval-when (eval load) (setq foo6 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (eval-when (eval compile load) (setq foo7 'bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 When @file{foo.el} is compiled, these variables will be set during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 the compilation itself:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 foo1 foo3 foo5 foo7 ; `compile'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 When @file{foo.elc} is loaded, these variables will be set:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 foo2 foo3 foo6 foo7 ; `load'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 And if @file{foo.el} is loaded uncompiled, these variables will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 be set:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 foo4 foo5 foo6 foo7 ; `eval'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 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
673 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
674 last four would have been equivalent to the corresponding @code{setq}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 Note that @code{(eval-when (load eval) @dots{})} is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 to @code{(progn @dots{})} in all contexts. The compiler treats
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 certain top-level forms, like @code{defmacro} (sort-of) and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 @code{require}, as if they were wrapped in @code{(eval-when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 (compile load eval) @dots{})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 Emacs 19 includes two special forms related to @code{eval-when}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 One of these, @code{eval-when-compile}, is not quite equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 any @code{eval-when} construct and is described below. This package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 defines a version of @code{eval-when-compile} for the benefit of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 Emacs 18 users.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 The other form, @code{(eval-and-compile @dots{})}, is exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 equivalent to @samp{(eval-when (compile load eval) @dots{})} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 so is not itself defined by this package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 @defspec eval-when-compile forms...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 The @var{forms} are evaluated at compile-time; at execution time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 this form acts like a quoted constant of the resulting value. Used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 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
697 (compile eval)}. In other contexts, @code{eval-when-compile}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 allows code to be evaluated once at compile-time for efficiency
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 or other reasons.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 This form is similar to the @samp{#.} syntax of true Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 @defspec load-time-value form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 The @var{form} is evaluated at load-time; at execution time,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 this form acts like a quoted constant of the resulting value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 Early Common Lisp had a @samp{#,} syntax that was similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 this, but ANSI Common Lisp replaced it with @code{load-time-value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 and gave it more well-defined semantics.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 In a compiled file, @code{load-time-value} arranges for @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 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
714 as if it were a quoted constant. In code compiled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 @code{byte-compile} rather than @code{byte-compile-file}, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 effect is identical to @code{eval-when-compile}. In uncompiled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 code, both @code{eval-when-compile} and @code{load-time-value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 act exactly like @code{progn}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 (defun report ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 (insert "This function was executed on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 (current-time-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 ", compiled on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 (eval-when-compile (current-time-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 ;; or '#.(current-time-string) in real Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 ", and loaded on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 (load-time-value (current-time-string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 Byte-compiled, the above defun will result in the following code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 (or its compiled equivalent, of course) in the @file{.elc} file:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 (setq --temp-- (current-time-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (defun report ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (insert "This function was executed on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 (current-time-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 ", compiled on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 '"Wed Jun 23 18:33:43 1993"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 ", and loaded on: "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 --temp--))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 @node Function Aliases, , Time of Evaluation, Program Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 @section Function Aliases
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 This section describes a feature from GNU Emacs 19 which this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 package makes available in other versions of Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 @defun defalias symbol function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 This function sets @var{symbol}'s function cell to @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 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
757 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
758 by a later @code{unload-feature}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 In other versions of Emacs, @code{defalias} is a synonym for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 @code{fset}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 @node Predicates, Control Structure, Program Structure, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 @chapter Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 This section describes functions for testing whether various
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 facts are true or false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 * Type Predicates:: `typep', `deftype', and `coerce'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 * Equality Predicates:: `eql' and `equalp'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 @node Type Predicates, Equality Predicates, Predicates, Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 @section Type Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 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
781 predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 @defun typep object type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 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
785 (quoted) type name of the sort used by Common Lisp. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 @code{(typep foo 'integer)} is equivalent to @code{(integerp foo)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 The @var{type} argument to the above function is either a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 or a list beginning with a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 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
795 symbol name to form the name of a predicate function for testing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 the type. (Built-in predicates whose names end in @samp{p} rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 than @samp{-p} are used when appropriate.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 The type symbol @code{t} stands for the union of all types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 @code{(typep @var{object} t)} is always true. Likewise, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 type symbol @code{nil} stands for nothing at all, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 @code{(typep @var{object} nil)} is always false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 The type symbol @code{null} represents the symbol @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 Thus @code{(typep @var{object} 'null)} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 @code{(null @var{object})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 The type symbol @code{real} is a synonym for @code{number}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 @code{fixnum} is a synonym for @code{integer}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 The type symbols @code{character} and @code{string-char} match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 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
817 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
818 first-class data type, this checks for actual characters, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 @code{(typep @var{8bit-integer} 'character)} will return @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 The type symbol @code{float} uses the @code{floatp-safe} predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 defined by this package rather than @code{floatp}, so it will work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 correctly even in Emacs versions without floating-point support.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 The type list @code{(integer @var{low} @var{high})} represents all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 integers between @var{low} and @var{high}, inclusive. Either bound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 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
830 or a @code{*} to specify no limit. The type @code{(integer * *)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 is thus equivalent to @code{integer}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 Likewise, lists beginning with @code{float}, @code{real}, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 @code{number} represent numbers of that type falling in a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 range.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 Lists beginning with @code{and}, @code{or}, and @code{not} form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 combinations of types. For example, @code{(or integer (float 0 *))}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 represents all objects that are integers or non-negative floats.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 Lists beginning with @code{member} or @code{member*} represent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 objects @code{eql} to any of the following values. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 @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
847 and @code{(member nil)} is equivalent to @code{null}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 Lists of the form @code{(satisfies @var{predicate})} represent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 all objects for which @var{predicate} returns true when called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 with that object as an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 The following function and macro (not technically predicates) are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 related to @code{typep}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 @defun coerce object type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 This function attempts to convert @var{object} to the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 @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
861 @code{typep}, it is simply returned. Otherwise, certain types of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 conversions will be made: If @var{type} is any sequence type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 (@code{string}, @code{list}, etc.) then @var{object} will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 converted to that type if possible. If @var{type} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 @code{character}, then strings of length one and symbols with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 one-character names can be coerced. If @var{type} is @code{float},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 then integers can be coerced in versions of Emacs that support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 floats. In all other circumstances, @code{coerce} signals an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 @defspec deftype name arglist forms...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 This macro defines a new type called @var{name}. It is similar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 to @code{defmacro} in many ways; when @var{name} is encountered
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 as a type name, the body @var{forms} are evaluated and should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 return a type specifier that is equivalent to the type. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 @var{arglist} is a Common Lisp argument list of the sort accepted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 by @code{defmacro*}. The type specifier @samp{(@var{name} @var{args}...)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 is expanded by calling the expander with those arguments; the type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 symbol @samp{@var{name}} is expanded by calling the expander with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 no arguments. The @var{arglist} is processed the same as for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 @code{defmacro*} except that optional arguments without explicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 defaults use @code{*} instead of @code{nil} as the ``default''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 default. Some examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 (deftype null () '(satisfies null)) ; predefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 (deftype list () '(or null cons)) ; predefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 (deftype unsigned-byte (&optional bits)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 (list 'integer 0 (if (eq bits '*) bits (1- (lsh 1 bits)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 (unsigned-byte 8) @equiv{} (integer 0 255)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (unsigned-byte) @equiv{} (integer 0 *)
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 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 The last example shows how the Common Lisp @code{unsigned-byte}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 type specifier could be implemented if desired; this package does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 not implement @code{unsigned-byte} by default.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 The @code{typecase} and @code{check-type} macros also use type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 names. @xref{Conditionals}. @xref{Assertions}. The @code{map},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 @code{concatenate}, and @code{merge} functions take type-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 arguments to specify the type of sequence to return. @xref{Sequences}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 @node Equality Predicates, , Type Predicates, Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 @section Equality Predicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 This package defines two Common Lisp predicates, @code{eql} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 @code{equalp}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 @defun eql a b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 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
916 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
917 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
918 difference only for versions of Emacs that are compiled with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 floating-point support, such as Emacs 19. Emacs floats are allocated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 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
921 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
922 separately, the pointers will be different even though the numbers are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 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
924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 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
926 still false.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 Note that Emacs integers are ``direct'' rather than allocated, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 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
930 and @code{eql} behave differently only if floating-point numbers are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 involved, and are indistinguishable on Emacs versions that don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 support floats.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 There is a slight inconsistency with Common Lisp in the treatment of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 positive and negative zeros. Some machines, notably those with IEEE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 standard arithmetic, represent @code{+0} and @code{-0} as distinct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 values. Normally this doesn't matter because the standard specifies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 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
939 what Emacs Lisp and Common Lisp do. But the Common Lisp standard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 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
941 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
942 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
943 Lisp is to @code{format} them and check for a minus sign.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 @defun equalp a b
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 This function is a more flexible version of @code{equal}. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 particular, it compares strings and characters case-insensitively, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 it compares numbers without regard to type (so that @code{(equalp 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 3.0)} is true). Vectors and conses are compared recursively. All other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 objects are compared as if by @code{equal}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 This function differs from Common Lisp @code{equalp} in several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 respects. In keeping with the idea that strings are less
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 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
956 compare strings against vectors of integers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 Also note that the Common Lisp functions @code{member} and @code{assoc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 use @code{eql} to compare elements, whereas Emacs Lisp follows the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 MacLisp tradition and uses @code{equal} for these two functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 In Emacs, use @code{member*} and @code{assoc*} to get functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 which use @code{eql} for comparisons.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 @node Control Structure, Macros, Predicates, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 @chapter Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 The features described in the following sections implement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 various advanced control structures, including the powerful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 @code{setf} facility and a number of looping and conditional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 constructs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 * Assignment:: The `psetq' form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 * Generalized Variables:: `setf', `incf', `push', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 * Variable Bindings:: `progv', `lexical-let', `flet', `macrolet'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 * Conditionals:: `when', `unless', `case', `typecase'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 * Blocks and Exits:: `block', `return', `return-from'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 * Iteration:: `do', `dotimes', `dolist', `do-symbols'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 * Loop Facility:: The Common Lisp `loop' macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 * Multiple Values:: `values', `multiple-value-bind', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 @node Assignment, Generalized Variables, Control Structure, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 @section Assignment
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 The @code{psetq} form is just like @code{setq}, except that multiple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 assignments are done in parallel rather than sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 @defspec psetq [symbol form]@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 This special form (actually a macro) is used to assign to several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 variables simultaneously. Given only one @var{symbol} and @var{form},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 it has the same effect as @code{setq}. Given several @var{symbol}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 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
997 and then stores the corresponding variables afterwards.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 (setq x 2 y 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 (setq x (+ x y) y (* x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 y ; @r{@code{y} was computed after @code{x} was set.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 @result{} 15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 (setq x 2 y 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 (psetq x (+ x y) y (* x y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 y ; @r{@code{y} was computed before @code{x} was set.}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 @result{} 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 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
1015 exchanges the values of two variables. (The @code{rotatef} form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 provides an even more convenient way to swap two variables;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 @pxref{Modify Macros}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 @code{psetq} always returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 @node Generalized Variables, Variable Bindings, Assignment, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 @section Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 A ``generalized variable'' or ``place form'' is one of the many places
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 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
1028 a regular Lisp variable. But the cars and cdrs of lists, elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 of arrays, properties of symbols, and many other locations are also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 places where Lisp values are stored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 The @code{setf} form is like @code{setq}, except that it accepts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 arbitrary place forms on the left side rather than just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 symbols. For example, @code{(setf (car a) b)} sets the car of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 @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
1036 but without having to remember two separate functions for setting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 and accessing every type of place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 Generalized variables are analogous to ``lvalues'' in the C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 language, where @samp{x = a[i]} gets an element from an array
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 and @samp{a[i] = x} stores an element using the same notation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 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
1043 is a set of forms that can be generalized variables in Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 * Basic Setf:: `setf' and place forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 * Modify Macros:: `incf', `push', `rotatef', `letf', `callf', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 * Customizing Setf:: `define-modify-macro', `defsetf', `define-setf-method'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 @node Basic Setf, Modify Macros, Generalized Variables, Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 @subsection Basic Setf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 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
1056 variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 @defspec setf [place form]@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 This macro evaluates @var{form} and stores it in @var{place}, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 must be a valid generalized variable form. If there are several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 @var{place} and @var{form} pairs, the assignments are done sequentially
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 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
1063 @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 The following Lisp forms will work as generalized variables, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 so may legally appear in the @var{place} argument of @code{setf}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 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
1071 exactly equivalent to @code{(setq x y)}, and @code{setq} itself is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 strictly speaking redundant now that @code{setf} exists. Many
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 programmers continue to prefer @code{setq} for setting simple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 variables, though, purely for stylistic or historical reasons.
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1075 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
1076 so there is no performance penalty for using it in compiled code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 A call to any of the following Lisp functions:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 car cdr caar .. cddddr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 nth rest first .. tenth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 aref elt nthcdr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 symbol-function symbol-value symbol-plist
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1086 get getf gethash
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1087 subseq
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 Note that for @code{nthcdr} and @code{getf}, the list argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 of the function must itself be a valid @var{place} form. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 example, @code{(setf (nthcdr 0 foo) 7)} will set @code{foo} itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 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
1095 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
1096 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
1097 to standard Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 The following Emacs-specific functions are also @code{setf}-able.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 (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
1102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 @smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 buffer-file-name marker-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 buffer-modified-p match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 buffer-name mouse-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 buffer-string overlay-end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 buffer-substring overlay-get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 current-buffer overlay-start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 current-case-table point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 current-column point-marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 current-global-map point-max
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 current-input-mode point-min
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 current-local-map process-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 current-window-configuration process-filter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 default-file-modes process-sentinel
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 default-value read-mouse-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 documentation-property screen-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 extent-data screen-menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 extent-end-position screen-width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 extent-start-position selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 face-background selected-screen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 face-background-pixmap selected-frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 face-font standard-case-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 face-foreground syntax-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 face-underline-p window-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 file-modes window-dedicated-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 frame-height window-display-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 frame-parameters window-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 frame-visible-p window-hscroll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 frame-width window-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 get-register window-start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 getenv window-width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 global-key-binding x-get-cut-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 keymap-parent x-get-cutbuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 local-key-binding x-get-secondary-selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 mark x-get-selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 mark-marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 @end smallexample
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 Most of these have directly corresponding ``set'' functions, like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 @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
1143 for @code{point}. A few, like @code{point-min}, expand to longer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 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
1145 x (point-max))} in this case).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 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
1149 where @var{subplace} is itself a legal generalized variable whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 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
1151 string. The new string is spliced into the specified part of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 destination string. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 (setq a (list "hello" "world"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 @result{} ("hello" "world")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 (cadr a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 @result{} "world"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 (substring (cadr a) 2 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 @result{} "rl"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 (setf (substring (cadr a) 2 4) "o")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 @result{} "o"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 (cadr a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 @result{} "wood"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 @result{} ("hello" "wood")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 The generalized variable @code{buffer-substring}, listed above,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 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
1171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 A call of the form @code{(apply '@var{func} @dots{})} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 @code{(apply (function @var{func}) @dots{})}, where @var{func}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 is a @code{setf}-able function whose store function is ``suitable''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 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
1177 Emacs place functions are suitable in this sense, this feature is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 only interesting when used with places you define yourself with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 @code{define-setf-method} or the long form of @code{defsetf}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 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
1183 is applied to the resulting form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 Any form for which a @code{defsetf} or @code{define-setf-method}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 has been made.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 Using any forms other than these in the @var{place} argument to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 @code{setf} will signal an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 The @code{setf} macro takes care to evaluate all subforms in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 the proper left-to-right order; for example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 (setf (aref vec (incf i)) i)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 looks like it will evaluate @code{(incf i)} exactly once, before the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 following access to @code{i}; the @code{setf} expander will insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 temporary variables as necessary to ensure that it does in fact work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 this way no matter what setf-method is defined for @code{aref}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 (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
1206 be necessary since @code{aset} takes its arguments in a convenient
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 order.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 However, if the @var{place} form is a macro which explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 evaluates its arguments in an unusual order, this unusual order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 will be preserved. Adapting an example from Steele, given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 (defmacro wrong-order (x y) (list 'aref y x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 the form @code{(setf (wrong-order @var{a} @var{b}) 17)} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 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
1220 to @code{wrong-order}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 @node Modify Macros, Customizing Setf, Basic Setf, Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 @subsection Modify Macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 This package defines a number of other macros besides @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 that operate on generalized variables. Many are interesting and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 useful even when the @var{place} is just a variable name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 @defspec psetf [place form]@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 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
1233 When several @var{place}s and @var{form}s are involved, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 assignments take place in parallel rather than sequentially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 Specifically, all subforms are evaluated from left to right, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 all the assignments are done (in an undefined order).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 @defspec incf place &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 This macro increments the number stored in @var{place} by one, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 by @var{x} if specified. The incremented value is returned. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 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
1243 @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
1244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 Once again, care is taken to preserve the ``apparent'' order of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 evaluation. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 (incf (aref vec (incf i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 appears to increment @code{i} once, then increment the element of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 @code{vec} addressed by @code{i}; this is indeed exactly what it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 does, which means the above form is @emph{not} equivalent to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 ``obvious'' expansion,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 (setf (aref vec (incf i)) (1+ (aref vec (incf i)))) ; Wrong!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 but rather to something more like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 (let ((temp (incf i)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 (setf (aref vec temp) (1+ (aref vec temp))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 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
1272 the other generalized-variable macros.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 As a more Emacs-specific example of @code{incf}, the expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 @code{(incf (point) @var{n})} is essentially equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 @code{(forward-char @var{n})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 @defspec decf place &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 This macro decrements the number stored in @var{place} by one, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 by @var{x} if specified.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 @defspec pop place
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 This macro removes and returns the first element of the list stored
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 in @var{place}. It is analogous to @code{(prog1 (car @var{place})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 (setf @var{place} (cdr @var{place})))}, except that it takes care
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 to evaluate all subforms only once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 @defspec push x place
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 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
1293 @var{place}. It is analogous to @code{(setf @var{place} (cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 @var{x} @var{place}))}, except for evaluation of the subforms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 @defspec pushnew x place @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 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
1299 @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
1300 existing element of the list. The optional keyword arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 are interpreted in the same way as for @code{adjoin}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 @xref{Lists as Sets}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 @defspec shiftf place@dots{} newvalue
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 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
1307 value of @var{newvalue} (which may be any Lisp expression, not just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 a generalized variable), and returning the value shifted out of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 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
1310 @var{d})} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 (prog1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 @var{a}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 (psetf @var{a} @var{b}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 @var{b} @var{c}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 @var{c} @var{d}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 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
1322 evaluated only once each and in the apparent order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 @defspec rotatef place@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 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
1327 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
1328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 (psetf @var{a} @var{b}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 @var{b} @var{c}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 @var{c} @var{d}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 @var{d} @var{a})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 except for the evaluation of subforms. @code{rotatef} always
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 returns @code{nil}. Note that @code{(rotatef @var{a} @var{b})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 conveniently exchanges @var{a} and @var{b}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 The following macros were invented for this package; they have no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 analogues in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 @defspec letf (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 This macro is analogous to @code{let}, but for generalized variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 rather than just symbols. Each @var{binding} should be of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 @code{(@var{place} @var{value})}; the original contents of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 @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
1350 then the body @var{form}s are executed. Afterwards, the @var{places}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 are set back to their original saved contents. This cleanup happens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 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
1353 error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 (letf (((point) (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 (a 17))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 moves ``point'' in the current buffer to the beginning of the buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 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
1366 @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
1367 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
1368 original position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 Note that @code{letf} on @code{(point)} is not quite like a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 @code{save-excursion}, as the latter effectively saves a marker
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 which tracks insertions and deletions in the buffer. Actually,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 a @code{letf} of @code{(point-marker)} is much closer to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 behavior. (@code{point} and @code{point-marker} are equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 as @code{setf} places; each will accept either an integer or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 marker as the stored value.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 Since generalized variables look like lists, @code{let}'s shorthand
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 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
1380 be ambiguous in @code{letf} and is not allowed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 However, a @var{binding} specifier may be a one-element list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 @samp{(@var{place})}, which is similar to @samp{(@var{place}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 @var{place})}. In other words, the @var{place} is not disturbed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 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
1386 to restore the original value of @var{place} afterwards. (The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 redundant access-and-store suggested by the @code{(@var{place}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 @var{place})} example does not actually occur.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 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
1391 entry to the @code{letf} form. The only exceptions are plain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 variables and calls to @code{symbol-value} and @code{symbol-function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 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
1394 @code{makunbound} or @code{fmakunbound} on exit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 @defspec letf* (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 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
1399 It does the bindings in sequential rather than parallel order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 @defspec callf @var{function} @var{place} @var{args}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 This is the ``generic'' modify macro. It calls @var{function},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 which should be an unquoted function name, macro name, or lambda.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 It passes @var{place} and @var{args} as arguments, and assigns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 result back to @var{place}. For example, @code{(incf @var{place}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 @var{n})} is the same as @code{(callf + @var{place} @var{n})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 Some more examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 (callf abs my-number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 (callf concat (buffer-name) "<" (int-to-string n) ">")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 (callf union happy-people (list joe bob) :test 'same-person)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 @xref{Customizing Setf}, for @code{define-modify-macro}, a way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 to create even more concise notations for modify macros. Note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 again that @code{callf} is an extension to standard Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 @defspec callf2 @var{function} @var{arg1} @var{place} @var{args}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 This macro is like @code{callf}, except that @var{place} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 the @emph{second} argument of @var{function} rather than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 first. For example, @code{(push @var{x} @var{place})} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 equivalent to @code{(callf2 cons @var{x} @var{place})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 The @code{callf} and @code{callf2} macros serve as building
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 blocks for other macros like @code{incf}, @code{pushnew}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 @code{define-modify-macro}. The @code{letf} and @code{letf*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 macros are used in the processing of symbol macros;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 @pxref{Macro Bindings}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 @node Customizing Setf, , Modify Macros, Generalized Variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 @subsection Customizing Setf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 Common Lisp defines three macros, @code{define-modify-macro},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 @code{defsetf}, and @code{define-setf-method}, that allow the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 user to extend generalized variables in various ways.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 @defspec define-modify-macro name arglist function [doc-string]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 This macro defines a ``read-modify-write'' macro similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 @code{incf} and @code{decf}. The macro @var{name} is defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 to take a @var{place} argument followed by additional arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 described by @var{arglist}. The call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 (@var{name} @var{place} @var{args}...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 will be expanded to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 (callf @var{func} @var{place} @var{args}...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 which in turn is roughly equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 (setf @var{place} (@var{func} @var{place} @var{args}...))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 (define-modify-macro incf (&optional (n 1)) +)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 (define-modify-macro concatf (&rest args) concat)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 Note that @code{&key} is not allowed in @var{arglist}, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 @code{&rest} is sufficient to pass keywords on to the function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 Most of the modify macros defined by Common Lisp do not exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 follow the pattern of @code{define-modify-macro}. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 @code{push} takes its arguments in the wrong order, and @code{pop}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 is completely irregular. You can define these macros ``by hand''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 using @code{get-setf-method}, or consult the source file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 @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
1482 building blocks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 @defspec defsetf access-fn update-fn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 This is the simpler of two @code{defsetf} forms. Where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 @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
1488 this declares @var{update-fn} to be the corresponding store
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 function. From now on,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 (setf (@var{access-fn} @var{arg1} @var{arg2} @var{arg3}) @var{value})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 will be expanded to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 (@var{update-fn} @var{arg1} @var{arg2} @var{arg3} @var{value})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 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
1504 a macro which evaluates its arguments in a function-like way. Also,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 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
1506 Otherwise, the above expansion would not obey the rules for the way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 @code{setf} is supposed to behave.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 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
1510 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
1511 not suitable, so that the above @code{setf} should be expanded to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 something more like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515 (let ((temp @var{value}))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 (@var{update-fn} @var{arg1} @var{arg2} @var{arg3} temp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 temp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 Some examples of the use of @code{defsetf}, drawn from the standard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 suite of setf methods, are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 (defsetf car setcar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 (defsetf symbol-value set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 (defsetf buffer-name rename-buffer t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 @defspec defsetf access-fn arglist (store-var) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 This is the second, more complex, form of @code{defsetf}. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 rather like @code{defmacro} except for the additional @var{store-var}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 argument. The @var{forms} should return a Lisp form which stores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 the value of @var{store-var} into the generalized variable formed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 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
1536 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
1537 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
1538 function).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 For example, the simple form of @code{defsetf} is shorthand for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 (defsetf @var{access-fn} (&rest args) (store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 (append '(@var{update-fn}) args (list store)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 The Lisp form that is returned can access the arguments from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 @var{arglist} and @var{store-var} in an unrestricted fashion;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 macros like @code{setf} and @code{incf} which invoke this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 setf-method will insert temporary variables as needed to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 sure the apparent order of evaluation is preserved.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 Another example drawn from the standard package:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 (defsetf nth (n x) (store)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 (list 'setcar (list 'nthcdr n x) store))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 @defspec define-setf-method access-fn arglist forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 This is the most general way to create new place forms. When
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 a @code{setf} to @var{access-fn} with arguments described by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 @var{arglist} is expanded, the @var{forms} are evaluated and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 must return a list of five items:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 @enumerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 A list of @dfn{temporary variables}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 A list of @dfn{value forms} corresponding to the temporary variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 above. The temporary variables will be bound to these value forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 as the first step of any operation on the generalized variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 A list of exactly one @dfn{store variable} (generally obtained
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 from a call to @code{gensym}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 A Lisp form which stores the contents of the store variable into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 the generalized variable, assuming the temporaries have been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 bound as described above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 A Lisp form which accesses the contents of the generalized variable,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 assuming the temporaries have been bound.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 @end enumerate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 This is exactly like the Common Lisp macro of the same name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 except that the method returns a list of five values rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 than the five values themselves, since Emacs Lisp does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 support Common Lisp's notion of multiple return values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 Once again, the @var{forms} may begin with a documentation string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 A setf-method should be maximally conservative with regard to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 temporary variables. In the setf-methods generated by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 @code{defsetf}, the second return value is simply the list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 arguments in the place form, and the first return value is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 list of a corresponding number of temporary variables generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 by @code{gensym}. Macros like @code{setf} and @code{incf} which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 use this setf-method will optimize away most temporaries that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 turn out to be unnecessary, so there is little reason for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 setf-method itself to optimize.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 @defun get-setf-method place &optional env
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 This function returns the setf-method for @var{place}, by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 invoking the definition previously recorded by @code{defsetf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 or @code{define-setf-method}. The result is a list of five
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 values as described above. You can use this function to build
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 your own @code{incf}-like modify macros. (Actually, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 better to use the internal functions @code{cl-setf-do-modify}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 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
1616 which also do a number of optimizations; consult the source
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 code for the @code{incf} function for a simple example.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 The argument @var{env} specifies the ``environment'' to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 passed on to @code{macroexpand} if @code{get-setf-method} should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 need to expand a macro in @var{place}. It should come from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 an @code{&environment} argument to the macro or setf-method
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 that called @code{get-setf-method}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 See also the source code for the setf-methods for @code{apply}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 and @code{substring}, each of which works by calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 @code{get-setf-method} on a simpler case, then massaging
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 the result in various ways.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 Modern Common Lisp defines a second, independent way to specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 the @code{setf} behavior of a function, namely ``@code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 functions'' whose names are lists @code{(setf @var{name})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 rather than symbols. For example, @code{(defun (setf foo) @dots{})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 defines the function that is used when @code{setf} is applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 @code{foo}. This package does not currently support @code{setf}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 functions. In particular, it is a compile-time error to use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 @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
1639 or otherwise declared; in newer Common Lisps, this would not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 an error since the function @code{(setf @var{func})} might be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 defined later.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 @secno=4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 @node Variable Bindings, Conditionals, Generalized Variables, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 @section Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 These Lisp forms make bindings to variables and function names,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 analogous to Lisp's built-in @code{let} form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 @xref{Modify Macros}, for the @code{letf} and @code{letf*} forms which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 are also related to variable bindings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 * Dynamic Bindings:: The `progv' form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 * Lexical Bindings:: `lexical-let' and lexical closures
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 * Function Bindings:: `flet' and `labels'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 * Macro Bindings:: `macrolet' and `symbol-macrolet'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 @node Dynamic Bindings, Lexical Bindings, Variable Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 @subsection Dynamic Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 The standard @code{let} form binds variables whose names are known
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 at compile-time. The @code{progv} form provides an easy way to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 bind variables whose names are computed at run-time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 @defspec progv symbols values forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 This form establishes @code{let}-style variable bindings on a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 set of variables computed at run-time. The expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 @var{symbols} and @var{values} are evaluated, and must return lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 of symbols and values, respectively. The symbols are bound to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 corresponding values for the duration of the body @var{form}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 If @var{values} is shorter than @var{symbols}, the last few symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 are made unbound (as if by @code{makunbound}) inside the body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 If @var{symbols} is shorter than @var{values}, the excess values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 @node Lexical Bindings, Function Bindings, Dynamic Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 @subsection Lexical Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 The @dfn{CL} package defines the following macro which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 more closely follows the Common Lisp @code{let} form:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 @defspec lexical-let (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 This form is exactly like @code{let} except that the bindings it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 establishes are purely lexical. Lexical bindings are similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 local variables in a language like C: Only the code physically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 within the body of the @code{lexical-let} (after macro expansion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 may refer to the bound variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 (setq a 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 (defun foo (b) (+ a b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 (let ((a 2)) (foo a))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 @result{} 4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 (lexical-let ((a 2)) (foo a))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 @result{} 7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 In this example, a regular @code{let} binding of @code{a} actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 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
1710 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
1711 actually creates a distinct local variable @code{a} for use within its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 body, without any effect on the global variable of the same name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 The most important use of lexical bindings is to create @dfn{closures}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 A closure is a function object that refers to an outside lexical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 variable. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 (defun make-adder (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 (lexical-let ((n n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 (function (lambda (m) (+ n m)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 (setq add17 (make-adder 17))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 (funcall add17 4)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 @result{} 21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 The call @code{(make-adder 17)} returns a function object which adds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 17 to its argument. If @code{let} had been used instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 @code{lexical-let}, the function object would have referred to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 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
1732 call to @code{make-adder} itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 (defun make-counter ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 (lexical-let ((n 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 (function* (lambda (&optional (m 1)) (incf n m)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 (setq count-1 (make-counter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 (funcall count-1 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 @result{} 3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 (funcall count-1 14)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 @result{} 17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 (setq count-2 (make-counter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 (funcall count-2 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 @result{} 5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 (funcall count-1 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 @result{} 19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 (funcall count-2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 @result{} 6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 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
1754 local variable @code{n}, which serves as a private counter for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 function object that is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 Closed-over lexical variables persist until the last reference to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 them goes away, just like all other Lisp objects. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 @code{count-2} refers to a function object which refers to an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 instance of the variable @code{n}; this is the only reference
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 to that variable, so after @code{(setq count-2 nil)} the garbage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 collector would be able to delete this instance of @code{n}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 Of course, if a @code{lexical-let} does not actually create any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 closures, then the lexical variables are free as soon as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 @code{lexical-let} returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 Many closures are used only during the extent of the bindings they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 refer to; these are known as ``downward funargs'' in Lisp parlance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 When a closure is used in this way, regular Emacs Lisp dynamic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 bindings suffice and will be more efficient than @code{lexical-let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 closures:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 (defun add-to-list (x list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 (mapcar (function (lambda (y) (+ x y))) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 (add-to-list 7 '(1 2 5))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 @result{} (8 9 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 Since this lambda is only used while @code{x} is still bound,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 it is not necessary to make a true closure out of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 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
1785 to create a named closure. If several closures are created in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 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
1787 instance of the lexical variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 The @code{lexical-let} form is an extension to Common Lisp. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 true Common Lisp, all bindings are lexical unless declared otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 @defspec lexical-let* (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 This form is just like @code{lexical-let}, except that the bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 are made sequentially in the manner of @code{let*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 @node Function Bindings, Macro Bindings, Lexical Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 @subsection Function Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 These forms make @code{let}-like bindings to functions instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 of variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 @defspec flet (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 This form establishes @code{let}-style bindings on the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 cells of symbols rather than on the value cells. Each @var{binding}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 must be a list of the form @samp{(@var{name} @var{arglist}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 @var{forms}@dots{})}, which defines a function exactly as if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 it were a @code{defun*} form. The function @var{name} is defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 accordingly for the duration of the body of the @code{flet}; then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 the old function definition, or lack thereof, is restored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 While @code{flet} in Common Lisp establishes a lexical binding of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 @var{name}, Emacs Lisp @code{flet} makes a dynamic binding. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 result is that @code{flet} affects indirect calls to a function as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 well as calls directly inside the @code{flet} form itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819 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
1820 function in a temporary fashion. This will even work on Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 primitives, although note that some calls to primitive functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 internal to Emacs are made without going through the symbol's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 function cell, and so will not be affected by @code{flet}. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 (flet ((message (&rest args) (push args saved-msgs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 (do-something))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831 This code attempts to replace the built-in function @code{message}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 with a function that simply saves the messages in a list rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 than displaying them. The original definition of @code{message}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 will be restored after @code{do-something} exits. This code will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 work fine on messages generated by other Lisp code, but messages
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 generated directly inside Emacs will not be caught since they make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 direct C-language calls to the message routines rather than going
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 through the Lisp @code{message} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 Functions defined by @code{flet} may use the full Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 argument notation supported by @code{defun*}; also, the function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 body is enclosed in an implicit block as if by @code{defun*}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 @xref{Program Structure}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 @defspec labels (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 The @code{labels} form is a synonym for @code{flet}. (In Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 Lisp, @code{labels} and @code{flet} differ in ways that depend on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 their lexical scoping; these distinctions vanish in dynamically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 scoped Emacs Lisp.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 @node Macro Bindings, , Function Bindings, Variable Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 @subsection Macro Bindings
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 These forms create local macros and ``symbol macros.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 @defspec macrolet (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 This form is analogous to @code{flet}, but for macros instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 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
1862 arguments to @code{defmacro*} (i.e., a macro name, argument list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 and macro-expander forms). The macro is defined accordingly for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 use within the body of the @code{macrolet}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 Because of the nature of macros, @code{macrolet} is lexically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 scoped even in Emacs Lisp: The @code{macrolet} binding will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 affect only calls that appear physically within the body
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 @var{forms}, possibly after expansion of other macros in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 body.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 @defspec symbol-macrolet (bindings@dots{}) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 This form creates @dfn{symbol macros}, which are macros that look
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 like variable references rather than function calls. Each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 @var{binding} is a list @samp{(@var{var} @var{expansion})};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 any reference to @var{var} within the body @var{forms} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 replaced by @var{expansion}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 (setq bar '(5 . 9))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 (symbol-macrolet ((foo (car bar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 (incf foo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 bar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 @result{} (6 . 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 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
1889 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
1890 @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
1891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 Likewise, a @code{let} or @code{let*} binding a symbol macro is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 treated like a @code{letf} or @code{letf*}. This differs from true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 Common Lisp, where the rules of lexical scoping cause a @code{let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 binding to shadow a @code{symbol-macrolet} binding. In this package,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 only @code{lexical-let} and @code{lexical-let*} will shadow a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 There is no analogue of @code{defmacro} for symbol macros; all symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 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
1901 expansion of another macro:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 (defmacro* my-dolist ((x list) &rest body)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 (let ((var (gensym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 (list 'loop 'for var 'on list 'do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 (list* 'symbol-macrolet (list (list x (list 'car var)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 body))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 (setq mylist '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 (my-dolist (x mylist) (incf x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 mylist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 @result{} (2 3 4 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 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
1918 (@pxref{Iteration}) except that the variable @code{x} becomes a true
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 reference onto the elements of the list. The @code{my-dolist} call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 shown here expands to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 (loop for G1234 on mylist do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 (symbol-macrolet ((x (car G1234)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 (incf x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 which in turn expands to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 (loop for G1234 on mylist do (incf (car G1234)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 @xref{Loop Facility}, for a description of the @code{loop} macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 This package defines a nonstandard @code{in-ref} loop clause that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 works much like @code{my-dolist}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 @node Conditionals, Blocks and Exits, Variable Bindings, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 @section Conditionals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 These conditional forms augment Emacs Lisp's simple @code{if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 @code{and}, @code{or}, and @code{cond} forms.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 @defspec when test forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 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
1949 and possibly several ``then'' forms. In particular,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 (when @var{test} @var{a} @var{b} @var{c})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 is entirely equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 (if @var{test} (progn @var{a} @var{b} @var{c}) nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 @defspec unless test forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 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
1965 and possibly several ``else'' forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 (unless @var{test} @var{a} @var{b} @var{c})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 is entirely equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 (when (not @var{test}) @var{a} @var{b} @var{c})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 @defspec case keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 This macro evaluates @var{keyform}, then compares it with the key
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 values listed in the various @var{clause}s. Whichever clause matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 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
1983 matches, the @code{case} form returns @code{nil}. The clauses are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 (@var{keylist} @var{body-forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 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
1992 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
1993 @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
1994 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
1995 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
1996 a @var{keylist} to indicate a default clause that should be taken
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997 if none of the other clauses match. (The symbol @code{otherwise}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 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
1999 matches the actual symbol @code{t}, @code{nil}, or @code{otherwise},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 enclose the symbol in a list.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002 For example, this expression reads a keystroke, then does one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 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
2004 a @key{RET} or @key{LFD}, or anything else.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 (case (read-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 (?a (do-a-thing))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 (?b (do-b-thing))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 ((?\r ?\n) (do-ret-thing))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 (t (do-other-thing)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 @defspec ecase keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 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
2017 not match any of the clauses, an error is signalled rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 simply returning @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 @defspec typecase keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 This macro is a version of @code{case} that checks for types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 rather than values. Each @var{clause} is of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 @samp{(@var{type} @var{body}...)}. @xref{Type Predicates},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 for a description of type specifiers. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 (typecase x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 (integer (munch-integer x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030 (float (munch-float x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 (string (munch-integer (string-to-int x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 (t (munch-anything x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 The type specifier @code{t} matches any type of object; the word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036 @code{otherwise} is also allowed. To make one clause match any of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 several types, use an @code{(or ...)} type specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 @defspec etypecase keyform clause@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 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
2042 not match any of the clauses, an error is signalled rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 simply returning @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2045
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 @node Blocks and Exits, Iteration, Conditionals, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047 @section Blocks and Exits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 Common Lisp @dfn{blocks} provide a non-local exit mechanism very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 similar to @code{catch} and @code{throw}, but lexically rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052 dynamically scoped. This package actually implements @code{block}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 in terms of @code{catch}; however, the lexical scoping allows the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 optimizing byte-compiler to omit the costly @code{catch} step if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 body of the block does not actually @code{return-from} the block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 @defspec block name forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 The @var{forms} are evaluated as if by a @code{progn}. However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 if any of the @var{forms} execute @code{(return-from @var{name})},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 they will jump out and return directly from the @code{block} form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 The @code{block} returns the result of the last @var{form} unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 a @code{return-from} occurs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064 The @code{block}/@code{return-from} mechanism is quite similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 the @code{catch}/@code{throw} mechanism. The main differences are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 that block @var{name}s are unevaluated symbols, rather than forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 (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
2068 also that blocks are lexically scoped whereas @code{catch}/@code{throw}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 are dynamically scoped. This means that functions called from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 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
2071 but the @code{return-from} referring to a block name must appear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 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
2073 They may not appear within other called functions, although they may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 appear within macro expansions or @code{lambda}s in the body. Block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 names and @code{catch} names form independent name-spaces.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 In true Common Lisp, @code{defun} and @code{defmacro} surround
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 the function or expander bodies with implicit blocks with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079 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
2080 Lisp, but this package provides @code{defun*} and @code{defmacro*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 forms which do create the implicit block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 The Common Lisp looping constructs defined by this package,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 such as @code{loop} and @code{dolist}, also create implicit blocks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 just as in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 Because they are implemented in terms of Emacs Lisp @code{catch}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 and @code{throw}, blocks have the same overhead as actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 @code{catch} constructs (roughly two function calls). However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090 Zawinski and Furuseth's optimizing byte compiler (standard in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 Emacs 19) will optimize away the @code{catch} if the block does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 not in fact contain any @code{return} or @code{return-from} calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 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
2094 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
2095 support it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 @defspec return-from name [result]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 This macro returns from the block named @var{name}, which must be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 an (unevaluated) symbol. If a @var{result} form is specified, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 is evaluated to produce the result returned from the @code{block}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 Otherwise, @code{nil} is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 @defspec return [result]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 This macro is exactly like @code{(return-from nil @var{result})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 Common Lisp loops like @code{do} and @code{dolist} implicitly enclose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108 themselves in @code{nil} blocks.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 @node Iteration, Loop Facility, Blocks and Exits, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112 @section Iteration
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115 The macros described here provide more sophisticated, high-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 looping constructs to complement Emacs Lisp's basic @code{while}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 @defspec loop forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 The @dfn{CL} package supports both the simple, old-style meaning of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 @code{loop} and the extremely powerful and flexible feature known as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 the @dfn{Loop Facility} or @dfn{Loop Macro}. This more advanced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 facility is discussed in the following section; @pxref{Loop Facility}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 The simple form of @code{loop} is described here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 If @code{loop} is followed by zero or more Lisp expressions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 then @code{(loop @var{exprs}@dots{})} simply creates an infinite
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 loop executing the expressions over and over. The loop is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 enclosed in an implicit @code{nil} block. Thus,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 (loop (foo) (if (no-more) (return 72)) (bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 is exactly equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 (block nil (while t (foo) (if (no-more) (return 72)) (bar)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 If any of the expressions are plain symbols, the loop is instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 interpreted as a Loop Macro specification as described later.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 (This is not a restriction in practice, since a plain symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 in the above notation would simply access and throw away the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 value of a variable.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 @defspec do (spec@dots{}) (end-test [result@dots{}]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 This macro creates a general iterative loop. Each @var{spec} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 of the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 (@var{var} [@var{init} [@var{step}]])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 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
2158 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
2159 each iteration of the loop, the @var{end-test} is evaluated; if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 true, the loop is finished. Otherwise, the body @var{forms} are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 evaluated, then each @var{var} is set to the associated @var{step}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 expression (as if by a @code{psetq} form) and the next iteration
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 begins. Once the @var{end-test} becomes true, the @var{result}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 forms are evaluated (with the @var{var}s still bound to their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 values) to produce the result returned by @code{do}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 The entire @code{do} loop is enclosed in an implicit @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 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
2169 loop at any time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 If there are no @var{result} forms, the loop returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 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
2173 @var{init} value but not otherwise modified during the @code{do}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 loop (unless the code explicitly modifies it); this case is just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 a shorthand for putting a @code{(let ((@var{var} @var{init})) @dots{})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 around the loop. If @var{init} is also omitted it defaults to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 @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
2178 in place of @samp{(@var{var})}, again following the analogy with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 @code{let}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 This example (from Steele) illustrates a loop which applies the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 function @code{f} to successive pairs of values from the lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 @code{foo} and @code{bar}; it is equivalent to the call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 @code{(mapcar* 'f foo bar)}. Note that this loop has no body
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 @var{forms} at all, performing all its work as side effects of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 the rest of the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 (do ((x foo (cdr x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 (y bar (cdr y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 (z nil (cons (f (car x) (car y)) z)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 ((or (null x) (null y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 (nreverse z)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 @defspec do* (spec@dots{}) (end-test [result@dots{}]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 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
2199 particular, the initial values are bound as if by @code{let*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 rather than @code{let}, and the steps are assigned as if by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201 @code{setq} rather than @code{psetq}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 Here is another way to write the above loop:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 (do* ((xp foo (cdr xp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207 (yp bar (cdr yp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 (x (car xp) (car xp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 (y (car yp) (car yp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 z)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211 ((or (null xp) (null yp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 (nreverse z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213 (push (f x y) z))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217 @defspec dolist (var list [result]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 This is a more specialized loop which iterates across the elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 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
2220 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
2221 turn. Finally, the @var{result} form (or @code{nil}) is evaluated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 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
2223 the loop. The loop is surrounded by an implicit @code{nil} block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 @defspec dotimes (var count [result]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 This is a more specialized loop which iterates a specified number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 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
2229 from zero (inclusive) to @var{count} (exclusive), in turn. Then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 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
2231 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
2232 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
2233 by an implicit @code{nil} block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 @defspec do-symbols (var [obarray [result]]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 This loop iterates over all interned symbols. If @var{obarray}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 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
2239 that obarray. For each symbol, the body @var{forms} are evaluated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 with @var{var} bound to that symbol. The symbols are visited in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 an unspecified order. Afterward the @var{result} form, if any,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 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
2243 value. The loop is surrounded by an implicit @code{nil} block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 @defspec do-all-symbols (var [result]) forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 This is identical to @code{do-symbols} except that the @var{obarray}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 argument is omitted; it always iterates over the default obarray.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 @xref{Mapping over Sequences}, for some more functions for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252 iterating over vectors or lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 @node Loop Facility, Multiple Values, Iteration, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 @section Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 A common complaint with Lisp's traditional looping constructs is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 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
2260 @code{dotimes} or Emacs Lisp's @code{while}, or too unreadable and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 obscure, like Common Lisp's @code{do} loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263 To remedy this, recent versions of Common Lisp have added a new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 construct called the ``Loop Facility'' or ``@code{loop} macro,''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 with an easy-to-use but very powerful and expressive syntax.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 * Loop Basics:: `loop' macro, basic clause structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 * Loop Examples:: Working examples of `loop' macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 * For Clauses:: Clauses introduced by `for' or `as'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 * Iteration Clauses:: `repeat', `while', `thereis', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 * Accumulation Clauses:: `collect', `sum', `maximize', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 * Other Clauses:: `with', `if', `initially', `finally'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 @node Loop Basics, Loop Examples, Loop Facility, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277 @subsection Loop Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280 The @code{loop} macro essentially creates a mini-language within
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 Lisp that is specially tailored for describing loops. While this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 language is a little strange-looking by the standards of regular Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 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
2284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 Since @code{loop} is a macro, all parsing of the loop language
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 takes place at byte-compile time; compiled @code{loop}s are just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 as efficient as the equivalent @code{while} loops written longhand.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 @defspec loop clauses@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 A loop construct consists of a series of @var{clause}s, each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 introduced by a symbol like @code{for} or @code{do}. Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292 are simply strung together in the argument list of @code{loop},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 with minimal extra parentheses. The various types of clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 specify initializations, such as the binding of temporary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 variables, actions to be taken in the loop, stepping actions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 and final cleanup.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 Common Lisp specifies a certain general order of clauses in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299 loop:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 (loop @var{name-clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 @var{var-clauses}@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 @var{action-clauses}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 The @var{name-clause} optionally gives a name to the implicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 block that surrounds the loop. By default, the implicit block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309 is named @code{nil}. The @var{var-clauses} specify what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 variables should be bound during the loop, and how they should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 be modified or iterated throughout the course of the loop. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 @var{action-clauses} are things to be done during the loop, such
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 as computing, collecting, and returning values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 The Emacs version of the @code{loop} macro is less restrictive about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 the order of clauses, but things will behave most predictably if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 you put the variable-binding clauses @code{with}, @code{for}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 @code{repeat} before the action clauses. As in Common Lisp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 @code{initially} and @code{finally} clauses can go anywhere.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 Loops generally return @code{nil} by default, but you can cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 them to return a value by using an accumulation clause like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 @code{collect}, an end-test clause like @code{always}, or an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 explicit @code{return} clause to jump out of the implicit block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 (Because the loop body is enclosed in an implicit block, you can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2326 also use regular Lisp @code{return} or @code{return-from} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 break out of the loop.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 The following sections give some examples of the Loop Macro in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 action, and describe the particular loop clauses in great detail.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 Consult the second edition of Steele's @dfn{Common Lisp, the Language},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 for additional discussion and examples of the @code{loop} macro.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 @node Loop Examples, For Clauses, Loop Basics, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 @subsection Loop Examples
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 Before listing the full set of clauses that are allowed, let's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 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
2341 language.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 (loop for buf in (buffer-list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 collect (buffer-file-name buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 This loop iterates over all Emacs buffers, using the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350 returned by @code{buffer-list}. For each buffer @code{buf},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 it calls @code{buffer-file-name} and collects the results into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 a list, which is then returned from the @code{loop} construct.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 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
2354 Emacs' memory. The words @code{for}, @code{in}, and @code{collect}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 are reserved words in the @code{loop} language.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 (loop repeat 20 do (insert "Yowsa\n"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 This loop inserts the phrase ``Yowsa'' twenty times in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 (loop until (eobp) do (munch-line) (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370 This loop calls @code{munch-line} on every line until the end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 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
2372 the loop exits immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375 (loop do (munch-line) until (eobp) do (forward-line 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379 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
2380 is always called at least once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 (loop for x from 1 to 100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2384 for y = (* x x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 until (>= y 729)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 finally return (list x (= y 729)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390 This more complicated loop searches for a number @code{x} whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2391 square is 729. For safety's sake it only examines @code{x}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2392 values up to 100; dropping the phrase @samp{to 100} would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 cause the loop to count upwards with no limit. The second
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 @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
2395 within the loop; the expression after the @code{=} sign is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 reevaluated each time through the loop. The @code{until}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 clause gives a condition for terminating the loop, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 @code{finally} clause says what to do when the loop finishes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 (This particular example was written less concisely than it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400 could have been, just for the sake of illustration.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 Note that even though this loop contains three clauses (two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403 @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
2404 define loops all by themselves, it still creates a single loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 rather than some sort of triple-nested loop. You must explicitly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 nest your @code{loop} constructs if you want nested loops.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 @node For Clauses, Iteration Clauses, Loop Examples, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 @subsection For Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412 Most loops are governed by one or more @code{for} clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 A @code{for} clause simultaneously describes variables to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 bound, how those variables are to be stepped during the loop,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415 and usually an end condition based on those variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 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
2418 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
2419 or @code{across} that describes the kind of iteration desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 In Common Lisp, the phrase @code{being the} sometimes precedes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 the type of iteration; in this package both @code{being} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 @code{the} are optional. The word @code{each} is a synonym
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2423 for @code{the}, and the word that follows it may be singular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 or plural: @samp{for x being the elements of y} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 @samp{for x being each element of y}. Which form you use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 is purely a matter of style.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 The variable is bound around the loop as if by @code{let}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 (setq i 'happy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 (loop for i from 1 to 10 do (do-something-with i))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 i
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 @result{} happy
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 @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
2439 This type of @code{for} clause creates a counting loop. Each of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 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
2441 term so that the clause is marked as a counting clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 The three expressions are the starting value, the ending value, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 the step value, respectively, of the variable. The loop counts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 upwards by default (@var{expr3} must be positive), from @var{expr1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 to @var{expr2} inclusively. If you omit the @code{from} term, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 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
2448 counts forever without stopping (unless stopped by some other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449 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
2450 counts in steps of one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 You can replace the word @code{from} with @code{upfrom} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453 @code{downfrom} to indicate the direction of the loop. Likewise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 you can replace @code{to} with @code{upto} or @code{downto}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 For example, @samp{for x from 5 downto 1} executes five times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 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
2457 Also, you can replace @code{to} with @code{below} or @code{above},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 which are like @code{upto} and @code{downto} respectively except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 that they are exclusive rather than inclusive limits:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 (loop for x to 10 collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463 @result{} (0 1 2 3 4 5 6 7 8 9 10)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 (loop for x below 10 collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 @result{} (0 1 2 3 4 5 6 7 8 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 The @code{by} value is always positive, even for downward-counting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2469 loops. Some sort of @code{from} value is required for downward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 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
2471 itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2473 @item for @var{var} in @var{list} by @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 This clause iterates @var{var} over all the elements of @var{list},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 in turn. If you specify the @code{by} term, then @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 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
2477 function taking one argument. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480 (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
2481 @result{} (1 4 9 16 25 36)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2482 (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
2483 @result{} (1 9 25)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 @item for @var{var} on @var{list} by @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 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
2488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490 (loop for x on '(1 2 3 4) collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 @result{} ((1 2 3 4) (2 3 4) (3 4) (4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 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
2495 must be a list. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 (loop for x on first-animal by 'next-animal collect x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 where @code{(next-animal x)} takes an ``animal'' @var{x} and returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 the next in the (assumed) sequence of animals, or @code{nil} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 @var{x} was the last animal in the sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 @item for @var{var} in-ref @var{list} by @var{function}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 This is like a regular @code{in} clause, but @var{var} becomes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2508 a @code{setf}-able ``reference'' onto the elements of the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 rather than just a temporary variable. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 (loop for x in-ref my-list do (incf x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2515 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 increments every element of @code{my-list} in place. This clause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 is an extension to standard Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519 @item for @var{var} across @var{array}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 This clause iterates @var{var} over all the elements of @var{array},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 which may be a vector or a string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524 (loop for x across "aeiou"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 do (use-vowel (char-to-string x)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 @item for @var{var} across-ref @var{array}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 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
2530 reference onto the elements; see @code{in-ref} above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 @item for @var{var} being the elements of @var{sequence}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 This clause iterates over the elements of @var{sequence}, which may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 be a list, vector, or string. Since the type must be determined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 at run-time, this is somewhat less efficient than @code{in} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 @code{across}. The clause may be followed by the additional term
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 @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
2538 the successive indices (starting at 0) of the elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 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
2541 and is not present in modern Common Lisp. The @samp{using (sequence ...)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 term of the older macros is not supported.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 @item for @var{var} being the elements of-ref @var{sequence}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 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
2546 reference onto the elements; see @code{in-ref} above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2547
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 @item for @var{var} being the symbols [of @var{obarray}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 This clause iterates over symbols, either over all interned symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 or over all symbols in @var{obarray}. The loop is executed with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 @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
2552 an unspecified order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2554 As an example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557 (loop for sym being the symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 when (fboundp sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2559 when (string-match "^map" (symbol-name sym))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2560 collect sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2561 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 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
2565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 The Common Lisp words @code{external-symbols} and @code{present-symbols}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 are also recognized but are equivalent to @code{symbols} in Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2569 Due to a minor implementation restriction, it will not work to have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2570 more than one @code{for} clause iterating over symbols, hash tables,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2571 keymaps, overlays, or intervals in a given @code{loop}. Fortunately,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2572 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
2573 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
2574 or @code{while}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 @item for @var{var} being the hash-keys of @var{hash-table}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2577 This clause iterates over the entries in @var{hash-table}. For each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 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
2579 @samp{the hash-values} instead, @var{var} is bound to the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 of the entries. The clause may be followed by the additional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 term @samp{using (hash-values @var{var2})} (where @code{hash-values}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 is the opposite word of the word following @code{the}) to cause
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2583 @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
2584 hash table entry.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2586 @item for @var{var} being the key-codes of @var{keymap}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587 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
2588 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
2589 or symbols. In XEmacs, keymaps are a special new data type, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 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
2591 nested keymaps or inherited (parent) keymaps. You can use @samp{the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2592 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
2593 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
2594 codes and the bindings together.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 @item for @var{var} being the key-seqs of @var{keymap}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 This clause iterates over all key sequences defined by @var{keymap}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 and its nested keymaps, where @var{var} takes on values which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 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
2600 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
2601 them permanently. You can add a @samp{using (key-bindings ...)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 clause to get the command bindings as well.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 @item for @var{var} being the overlays [of @var{buffer}] @dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605 This clause iterates over the Emacs 19 ``overlays'' or XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 ``extents'' of a buffer (the clause @code{extents} is synonymous with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 @code{overlays}). Under Emacs 18, this clause iterates zero times. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 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
2609 also accepts optional @samp{from @var{pos}} and @samp{to @var{pos}}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 terms, limiting the clause to overlays which overlap the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 region.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613 @item for @var{var} being the intervals [of @var{buffer}] @dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 This clause iterates over all intervals of a buffer with constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 text properties. The variable @var{var} will be bound to conses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616 of start and end positions, where one start position is always equal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 to the previous end position. The clause allows @code{of},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 @code{from}, @code{to}, and @code{property} terms, where the latter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619 term restricts the search to just the specified property. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2620 @code{of} term may specify either a buffer or a string. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 clause is useful only in GNU Emacs 19; in other versions, all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 buffers and strings consist of a single interval.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624 @item for @var{var} being the frames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 This clause iterates over all frames, i.e., X window system windows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 open on Emacs files. This clause works only under Emacs 19. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 clause @code{screens} is a synonym for @code{frames}. The frames
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628 are visited in @code{next-frame} order starting from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 @code{selected-frame}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 @item for @var{var} being the windows [of @var{frame}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 This clause iterates over the windows (in the Emacs sense) of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 the current frame, or of the specified @var{frame}. (In Emacs 18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 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
2635 allowed there.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637 @item for @var{var} being the buffers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 This clause iterates over all buffers in Emacs. It is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 to @samp{for @var{var} in (buffer-list)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 @item for @var{var} = @var{expr1} then @var{expr2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 This clause does a general iteration. The first time through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 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
2644 and successive iterations it will be set by evaluating @var{expr2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 (which may refer to the old value of @var{var}). For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 these two loops are effectively the same:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 (loop for x on my-list by 'cddr do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 (loop for x = my-list then (cddr x) while x do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653 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
2654 of terminating condition; the above example combines it with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 @code{while} clause to tell when to end the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657 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
2658 the initial setting and for successive settings:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 (loop for x = (random) when (> x 0) return x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 This loop keeps taking random numbers from the @code{(random)}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 function until it gets a positive one, which it then returns.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 If you include several @code{for} clauses in a row, they are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670 treated sequentially (as if by @code{let*} and @code{setq}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 You can instead use the word @code{and} to link the clauses,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 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
2673 and @code{psetq}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676 (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
2677 @result{} ((0 nil) (1 1) (2 2) (3 3) (4 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 (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
2679 @result{} ((0 nil) (1 0) (2 1) (3 2) (4 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 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
2684 that was just set by the previous clause; in the second loop,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685 @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
2686 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
2687 through the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 Another feature of the @code{loop} macro is @dfn{destructuring},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 similar in concept to the destructuring provided by @code{defmacro}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 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
2692 of variables instead of a single variable. The values produced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693 during loop execution must be lists; the values in the lists are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2694 stored in the corresponding variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2696 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2697 (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
2698 @result{} (5 9 13)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2699 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 In loop destructuring, if there are more values than variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 the trailing values are ignored, and if there are more variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 than values the trailing variables get the value @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704 If @code{nil} is used as a variable name, the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 values are ignored. Destructuring may be nested, and dotted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 lists of variables like @code{(x . y)} are allowed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 @node Iteration Clauses, Accumulation Clauses, For Clauses, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 @subsection Iteration Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 Aside from @code{for} clauses, there are several other loop clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713 that control the way the loop operates. They might be used by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 themselves, or in conjunction with one or more @code{for} clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 @item repeat @var{integer}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718 This clause simply counts up to the specified number using an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 internal temporary variable. The loops
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722 (loop repeat n do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 (loop for temp to n do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727 are identical except that the second one forces you to choose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 a name for a variable you aren't actually going to use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 @item while @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 This clause stops the loop when the specified condition (any Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 expression) becomes @code{nil}. For example, the following two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 loops are equivalent, except for the implicit @code{nil} block
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 that surrounds the second one:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 (while @var{cond} @var{forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 (loop while @var{cond} do @var{forms}@dots{})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 @item until @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 This clause stops the loop when the specified condition is true,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 i.e., non-@code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745 @item always @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 This clause stops the loop when the specified condition is @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 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
2748 the @code{finally} clauses are not executed. If all the conditions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 were non-@code{nil}, the loop returns @code{t}:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 (if (loop for size in size-list always (> size 10))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 (some-big-sizes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 (no-big-sizes))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 @item never @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 This clause is like @code{always}, except that the loop returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 @code{t} if any conditions were false, or @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 @item thereis @var{condition}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 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
2763 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
2764 values were @code{nil}, the loop returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2767 @node Accumulation Clauses, Other Clauses, Iteration Clauses, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 @subsection Accumulation Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 These clauses cause the loop to accumulate information about the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 specified Lisp @var{form}. The accumulated result is returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 from the loop unless overridden, say, by a @code{return} clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 @item collect @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 This clause collects the values of @var{form} into a list. Several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 examples of @code{collect} appear elsewhere in this manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 The word @code{collecting} is a synonym for @code{collect}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 likewise for the other accumulation clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783 @item append @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2784 This clause collects lists of values into a result list using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2785 @code{append}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 @item nconc @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 This clause collects lists of values into a result list by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 destructively modifying the lists rather than copying them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791 @item concat @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 This clause concatenates the values of the specified @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 into a string. (It and the following clause are extensions to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 standard Common Lisp.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 @item vconcat @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 This clause concatenates the values of the specified @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 into a vector.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2800 @item count @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 This clause counts the number of times the specified @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 evaluates to a non-@code{nil} value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 @item sum @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 This clause accumulates the sum of the values of the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 @var{form}, which must evaluate to a number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 @item maximize @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 This clause accumulates the maximum value of the specified @var{form},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 which must evaluate to a number. The return value is undefined if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 @code{maximize} is executed zero times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 @item minimize @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 This clause accumulates the minimum value of the specified @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 Accumulation clauses can be followed by @samp{into @var{var}} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818 cause the data to be collected into variable @var{var} (which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819 automatically @code{let}-bound during the loop) rather than an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 unnamed temporary variable. Also, @code{into} accumulations do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 not automatically imply a return value. The loop must use some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 explicit mechanism, such as @code{finally return}, to return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823 the accumulated result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 It is legal for several accumulation clauses of the same type to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826 accumulate into the same place. From Steele:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829 (loop for name in '(fred sue alice joe june)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 for kids in '((bob ken) () () (kris sunshine) ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 collect name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 append kids)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 @result{} (fred bob ken sue alice joe kris sunshine june)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 @node Other Clauses, , Accumulation Clauses, Loop Facility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 @subsection Other Clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2839 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 This section describes the remaining loop clauses.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843 @item with @var{var} = @var{value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 This clause binds a variable to a value around the loop, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 otherwise leaves the variable alone during the loop. The following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 loops are basically equivalent:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 (loop with x = 17 do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2850 (let ((x 17)) (loop do ...))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 (loop for x = 17 then x do ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 Naturally, the variable @var{var} might be used for some purpose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 in the rest of the loop. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 (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
2859 finally return res)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2862 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
2863 a new list being accumulated in @code{res}, then returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 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
2865 to that of a @code{collect} clause, but the list gets reversed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2866 by virtue of the fact that elements are being pushed onto the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867 front of @code{res} rather than the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 If you omit the @code{=} term, the variable is initialized to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 @code{nil}. (Thus the @samp{= nil} in the above example is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 unnecessary.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 Bindings made by @code{with} are sequential by default, as if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 by @code{let*}. Just like @code{for} clauses, @code{with} clauses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 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
2876 @code{let} instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2878 @item if @var{condition} @var{clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2879 This clause executes the following loop clause only if the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2880 condition is true. The following @var{clause} should be an accumulation,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2881 @code{do}, @code{return}, @code{if}, or @code{unless} clause.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2882 Several clauses may be linked by separating them with @code{and}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2883 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
2884 to execute if the condition was false. The whole construct may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2885 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
2886 disambiguate an @code{else} or @code{and} in a nested @code{if}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 The actual non-@code{nil} value of the condition form is available
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 by the name @code{it} in the ``then'' part. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 (setq funny-numbers '(6 13 -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 @result{} (6 13 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 (loop for x below 10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 if (oddp x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 collect x into odds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2897 and if (memq x funny-numbers) return (cdr it) end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 collect x into evens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900 finally return (vector odds evens))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2901 @result{} [(1 3 5 7 9) (0 2 4 6 8)]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902 (setq funny-numbers '(6 7 13 -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 @result{} (6 7 13 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 (loop <@r{same thing again}>)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 @result{} (13 -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 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
2909 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
2910 @code{end}, while normally optional, was necessary here to make
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2911 it clear that the @code{else} refers to the outermost @code{if}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 clause. In the first case, the loop returns a vector of lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2913 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
2914 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
2915 returns early; the actual returned value is based on the result
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 of the @code{memq} call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 @item when @var{condition} @var{clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919 This clause is just a synonym for @code{if}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 @item unless @var{condition} @var{clause}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 The @code{unless} clause is just like @code{if} except that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 sense of the condition is reversed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 @item named @var{name}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 This clause gives a name other than @code{nil} to the implicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 block surrounding the loop. The @var{name} is the symbol to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 used as the block name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 @item initially [do] @var{forms}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 This keyword introduces one or more Lisp forms which will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932 executed before the loop itself begins (but after any variables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 requested by @code{for} or @code{with} have been bound to their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 initial values). @code{initially} clauses can appear anywhere;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 if there are several, they are executed in the order they appear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 in the loop. The keyword @code{do} is optional.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 @item finally [do] @var{forms}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 This introduces Lisp forms which will be executed after the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 finishes (say, on request of a @code{for} or @code{while}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 @code{initially} and @code{finally} clauses may appear anywhere
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 in the loop construct, but they are executed (in the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 order) at the beginning or end, respectively, of the loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945 @item finally return @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 This says that @var{form} should be executed after the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 is done to obtain a return value. (Without this, or some other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 clause like @code{collect} or @code{return}, the loop will simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 return @code{nil}.) Variables bound by @code{for}, @code{with},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 or @code{into} will still contain their final values when @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951 is executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 @item do @var{forms}...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 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
2955 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
2956 loop. Many of the examples in this section illustrate the use of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 @code{do}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 @item return @var{form}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 This clause causes the loop to return immediately. The following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961 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
2962 form. The @code{finally} clauses, if any, are not executed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963 Of course, @code{return} is generally used inside an @code{if} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 @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
2965 the loop would never get to ``loop'' more than once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 The clause @samp{return @var{form}} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 @samp{do (return @var{form})} (or @code{return-from} if the loop
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 was named). The @code{return} clause is implemented a bit more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 efficiently, though.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 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
2974 (comparable to @code{defsetf} for @code{setf}, say), this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 does offer two properties called @code{cl-loop-handler} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 @code{cl-loop-for-handler} which are functions to be called when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 a given symbol is encountered as a top-level loop clause or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 @code{for} clause, respectively. Consult the source code in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 file @file{cl-macs.el} for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 This package's @code{loop} macro is compatible with that of Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982 Lisp, except that a few features are not implemented: @code{loop-finish}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 and data-type specifiers. Naturally, the @code{for} clauses which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 iterate over keymaps, overlays, intervals, frames, windows, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 buffers are Emacs-specific extensions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 @node Multiple Values, , Loop Facility, Control Structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 @section Multiple Values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 Common Lisp functions can return zero or more results. Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 functions, by contrast, always return exactly one result. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 package makes no attempt to emulate Common Lisp multiple return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 values; Emacs versions of Common Lisp functions that return more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 than one value either return just the first value (as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 @code{compiler-macroexpand}) or return a list of values (as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 @code{get-setf-method}). This package @emph{does} define placeholders
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 for the Common Lisp functions that work with multiple values, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999 in Emacs Lisp these functions simply operate on lists instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000 The @code{values} form, for example, is a synonym for @code{list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 in Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 @defspec multiple-value-bind (var@dots{}) values-form forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004 This form evaluates @var{values-form}, which must return a list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 values. It then binds the @var{var}s to these respective values,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006 as if by @code{let}, and then executes the body @var{forms}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 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
3008 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
3009 values, the excess values are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 @defspec multiple-value-setq (var@dots{}) form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 This form evaluates @var{form}, which must return a list of values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014 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
3015 @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
3016 in @code{multiple-value-bind}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3017 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3019 The older Quiroz package attempted a more faithful (but still
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020 imperfect) emulation of Common Lisp multiple values. The old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 method ``usually'' simulated true multiple values quite well,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 but under certain circumstances would leave spurious return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 values in memory where a later, unrelated @code{multiple-value-bind}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 form would see them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 Since a perfect emulation is not feasible in Emacs Lisp, this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 package opts to keep it as simple and predictable as possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 @node Macros, Declarations, Control Structure, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 @chapter Macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 This package implements the various Common Lisp features of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 @code{defmacro}, such as destructuring, @code{&environment},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 and @code{&body}. Top-level @code{&whole} is not implemented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 for @code{defmacro} due to technical difficulties.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 @xref{Argument Lists}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 Destructuring is made available to the user by way of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 following macro:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 @defspec destructuring-bind arglist expr forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 This macro expands to code which executes @var{forms}, with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 the variables in @var{arglist} bound to the list of values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 returned by @var{expr}. The @var{arglist} can include all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 the features allowed for @code{defmacro} argument lists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 including destructuring. (The @code{&environment} keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 is not allowed.) The macro expansion will signal an error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 if @var{expr} returns a list of the wrong number of arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050 or with incorrect keyword arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 This package also includes the Common Lisp @code{define-compiler-macro}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 facility, which allows you to define compile-time expansions and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055 optimizations for your functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3056
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3057 @defspec define-compiler-macro name arglist forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 This form is similar to @code{defmacro}, except that it only expands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 calls to @var{name} at compile-time; calls processed by the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 interpreter are not expanded, nor are they expanded by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 @code{macroexpand} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063 The argument list may begin with a @code{&whole} keyword and a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064 variable. This variable is bound to the macro-call form itself,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 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
3066 If the macro expander returns this form unchanged, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 compiler treats it as a normal function call. This allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068 compiler macros to work as optimizers for special cases of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 function, leaving complicated cases alone.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071 For example, here is a simplified version of a definition that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 appears as a standard part of this package:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 (define-compiler-macro member* (&whole form a list &rest keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076 (if (and (null keys)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 (eq (car-safe a) 'quote)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 (not (floatp-safe (cadr a))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3079 (list 'memq a list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3080 form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3081 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 This definition causes @code{(member* @var{a} @var{list})} to change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 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
3086 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
3087 if there are any keyword arguments in the call, then the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 @code{member*} call is left intact. (The actual compiler macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 for @code{member*} optimizes a number of other cases, including
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 common @code{:test} predicates.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093 @defun compiler-macroexpand form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 This function is analogous to @code{macroexpand}, except that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 expands compiler macros rather than regular macros. It returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 @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
3097 a compiler macro has been defined, or if that compiler macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 decided to punt by returning its @code{&whole} argument. Like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099 @code{macroexpand}, it expands repeatedly until it reaches a form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 for which no further expansion is possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3103 @xref{Macro Bindings}, for descriptions of the @code{macrolet}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3104 and @code{symbol-macrolet} forms for making ``local'' macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 definitions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107 @node Declarations, Symbols, Macros, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 @chapter Declarations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 Common Lisp includes a complex and powerful ``declaration''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 mechanism that allows you to give the compiler special hints
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 about the types of data that will be stored in particular variables,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114 and about the ways those variables and functions will be used. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 package defines versions of all the Common Lisp declaration forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116 @code{declare}, @code{locally}, @code{proclaim}, @code{declaim},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 and @code{the}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 Most of the Common Lisp declarations are not currently useful in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 Emacs Lisp, as the byte-code system provides little opportunity
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3121 to benefit from type information, and @code{special} declarations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 are redundant in a fully dynamically-scoped Lisp. A few
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123 declarations are meaningful when the optimizing Emacs 19 byte
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 compiler is being used, however. Under the earlier non-optimizing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 compiler, these declarations will effectively be ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3127 @defun proclaim decl-spec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3128 This function records a ``global'' declaration specified by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 @var{decl-spec}. Since @code{proclaim} is a function, @var{decl-spec}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 is evaluated and thus should normally be quoted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 @defspec declaim decl-specs@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134 This macro is like @code{proclaim}, except that it takes any number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 of @var{decl-spec} arguments, and the arguments are unevaluated and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 unquoted. The @code{declaim} macro also puts an @code{(eval-when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 (compile load eval) ...)} around the declarations so that they will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138 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
3139 since normally the declarations are meant to influence the way the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140 compiler treats the rest of the file that contains the @code{declaim}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3141 form.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3142 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3144 @defspec declare decl-specs@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3145 This macro is used to make declarations within functions and other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 code. Common Lisp allows declarations in various locations, generally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147 at the beginning of any of the many ``implicit @code{progn}s''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 throughout Lisp syntax, such as function bodies, @code{let} bodies,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 etc. Currently the only declaration understood by @code{declare}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 is @code{special}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 @defspec locally declarations@dots{} forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 In this package, @code{locally} is no different from @code{progn}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 @defspec the type form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 Type information provided by @code{the} is ignored in this package;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 in other words, @code{(the @var{type} @var{form})} is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 to @var{form}. Future versions of the optimizing byte-compiler may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 make use of this information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 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
3164 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
3165 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
3166 of time. With @code{(mapcar 'car (the vector foo))}, a future
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 compiler would have enough information to expand the loop in-line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 For now, Emacs Lisp will treat the above code as exactly equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3169 to @code{(mapcar 'car foo)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3170 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 Each @var{decl-spec} in a @code{proclaim}, @code{declaim}, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 @code{declare} should be a list beginning with a symbol that says
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 what kind of declaration it is. This package currently understands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175 @code{special}, @code{inline}, @code{notinline}, @code{optimize},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 and @code{warn} declarations. (The @code{warn} declaration is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 extension of standard Common Lisp.) Other Common Lisp declarations,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3178 such as @code{type} and @code{ftype}, are silently ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3180 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 @item special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 Since all variables in Emacs Lisp are ``special'' (in the Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 Lisp sense), @code{special} declarations are only advisory. They
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 simply tell the optimizing byte compiler that the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 variables are intentionally being referred to without being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186 bound in the body of the function. The compiler normally emits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187 warnings for such references, since they could be typographical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 errors for references to local variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 The declaration @code{(declare (special @var{var1} @var{var2}))} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191 equivalent to @code{(defvar @var{var1}) (defvar @var{var2})} in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 optimizing compiler, or to nothing at all in older compilers (which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 do not warn for non-local references).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3195 In top-level contexts, it is generally better to write
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3196 @code{(defvar @var{var})} than @code{(declaim (special @var{var}))},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3197 since @code{defvar} makes your intentions clearer. But the older
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3198 byte compilers can not handle @code{defvar}s appearing inside of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3199 functions, while @code{(declare (special @var{var}))} takes care
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3200 to work correctly with all compilers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3202 @item inline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203 The @code{inline} @var{decl-spec} lists one or more functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 whose bodies should be expanded ``in-line'' into calling functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 whenever the compiler is able to arrange for it. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 the Common Lisp function @code{cadr} is declared @code{inline}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 by this package so that the form @code{(cadr @var{x})} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 expand directly into @code{(car (cdr @var{x}))} when it is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209 in user functions, for a savings of one (relatively expensive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 function call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 The following declarations are all equivalent. Note that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 @code{defsubst} form is a convenient way to define a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214 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
3215 Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 (declaim (inline foo bar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 (eval-when (compile load eval) (proclaim '(inline foo bar)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3220 (proclaim-inline foo bar) ; XEmacs only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3221 (defsubst foo (...) ...) ; instead of defun; Emacs 19 only
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 @strong{Please note:} This declaration remains in effect after the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 containing source file is done. It is correct to use it to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 request that a function you have defined should be inlined,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 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
3228 function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 In Common Lisp, it is possible to use @code{(declare (inline @dots{}))}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 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
3232 be inlined; the current byte compilers provide no way to implement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 this, so @code{(declare (inline @dots{}))} is currently ignored by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 this package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236 @item notinline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 The @code{notinline} declaration lists functions which should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 not be inlined after all; it cancels a previous @code{inline}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 declaration.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 @item optimize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 This declaration controls how much optimization is performed by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 the compiler. Naturally, it is ignored by the earlier non-optimizing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 compilers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 The word @code{optimize} is followed by any number of lists like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 @code{(speed 3)} or @code{(safety 2)}. Common Lisp defines several
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 optimization ``qualities''; this package ignores all but @code{speed}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 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
3250 0 to 3, with 0 meaning ``unimportant'' and 3 meaning ``very important.''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251 The default level for both qualities is 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 In this package, with the Emacs 19 optimizing compiler, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254 @code{speed} quality is tied to the @code{byte-compile-optimize}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 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
3256 @code{t} for higher settings; and the @code{safety} quality is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3257 tied to the @code{byte-compile-delete-errors} flag, which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3258 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
3259 lower settings. (The latter flag controls whether the compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3260 is allowed to optimize out code whose only side-effect could
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3261 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
3262 @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
3263 at run-time.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 Note that even compiling with @code{(safety 0)}, the Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 byte-code system provides sufficient checking to prevent real
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 harm from being done. For example, barring serious bugs in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3268 Emacs itself, Emacs will not crash with a segmentation fault
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269 just because of an error in a fully-optimized Lisp program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 The @code{optimize} declaration is normally used in a top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272 @code{proclaim} or @code{declaim} in a file; Common Lisp allows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 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
3274 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
3275 current version of the optimizing compiler. (The @code{declare}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276 will set the new optimization level, but that level will not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 automatically be unset after the enclosing form is done.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 @item warn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280 This declaration controls what sorts of warnings are generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 by the byte compiler. Again, only the optimizing compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282 generates warnings. The word @code{warn} is followed by any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 number of ``warning qualities,'' similar in form to optimization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284 qualities. The currently supported warning types are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 @code{redefine}, @code{callargs}, @code{unresolved}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286 @code{free-vars}; in the current system, a value of 0 will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3287 disable these warnings and any higher value will enable them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3288 See the documentation for the optimizing byte compiler for details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 @node Symbols, Numbers, Declarations, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292 @chapter Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 This package defines several symbol-related features that were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 missing from Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 @menu
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3299 * Property Lists:: `getf', `remf'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 * Creating Symbols:: `gensym', `gentemp'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 @node Property Lists, Creating Symbols, Symbols, Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 @section Property Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 These functions augment the standard Emacs Lisp functions @code{get}
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3308 and @code{put} for operating on properties attached to objects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 There are also functions for working with property lists as
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3310 first-class data structures not attached to particular objects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3312 @defun getf place property &optional default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313 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
3314 list, i.e., a list of alternating property names and values. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 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
3316 to @var{property}, the following odd-numbered element is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 Otherwise, @var{default} is returned (or @code{nil} if no default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 is given).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3320 In particular,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3322 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3323 (get sym prop) @equiv{} (getf (symbol-plist sym) prop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3324 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3326 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
3327 its @var{place} argument must itself be a legal @code{setf} place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3328 The @var{default} argument, if any, is ignored in this context.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3329 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
3330 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
3331 pair onto the list if the property is not yet present.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3333 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3334 (put sym prop val) @equiv{} (setf (getf (symbol-plist sym) prop) val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3335 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3336
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
3337 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
3338 @code{default} is ignored can sometimes be useful:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3340 @example
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
3341 (incf (get 'foo 'usage-count 0))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3342 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3344 Here, symbol @code{foo}'s @code{usage-count} property is incremented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3345 if it exists, or set to 1 (an incremented 0) otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3347 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
3348 function and its @var{place} argument can actually be any Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3349 expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3350 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3352 @defspec remf place property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3353 This macro removes the property-value pair for @var{property} from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3354 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
3355 place expression. It returns true if the property was found. Note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3356 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
3357 effectively do a @code{(setf @var{place} (cddr @var{place}))},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3358 whereas if it occurs later, this simply uses @code{setcdr} to splice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3359 out the property and value cells.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3360 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3362 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3363 @secno=2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3364 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3366 @node Creating Symbols, , Property Lists, Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3367 @section Creating Symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3369 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3370 These functions create unique symbols, typically for use as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3371 temporary variables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3373 @defun gensym &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3374 This function creates a new, uninterned symbol (using @code{make-symbol})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3375 with a unique name. (The name of an uninterned symbol is relevant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3376 only if the symbol is printed.) By default, the name is generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3377 from an increasing sequence of numbers, @samp{G1000}, @samp{G1001},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3378 @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
3379 string is used as a prefix instead of @samp{G}. Uninterned symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3380 are used in macro expansions for temporary variables, to ensure that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3381 their names will not conflict with ``real'' variables in the user's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3382 code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3383 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3385 @defvar *gensym-counter*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3386 This variable holds the counter used to generate @code{gensym} names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3387 It is incremented after each use by @code{gensym}. In Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3388 this is initialized with 0, but this package initializes it with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3389 random (time-dependent) value to avoid trouble when two files that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3390 each used @code{gensym} in their compilation are loaded together.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3392 @strong{XEmacs note:} As of XEmacs 21.0, an uninterned symbol remains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3393 uninterned even after being dumped to bytecode. Older versions of Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3394 didn't distinguish the printed representation of interned and uninterned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3395 symbols, so their names had to be treated more carefully.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3396 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3398 @defun gentemp &optional x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3399 This function is like @code{gensym}, except that it produces a new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3400 @emph{interned} symbol. If the symbol that is generated already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3401 exists, the function keeps incrementing the counter and trying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3402 again until a new symbol is generated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3403 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3405 The Quiroz @file{cl.el} package also defined a @code{defkeyword}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3406 form for creating self-quoting keyword symbols. This package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3407 automatically creates all keywords that are called for by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3408 @code{&key} argument specifiers, and discourages the use of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3409 keywords as data unrelated to keyword arguments, so the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3410 @code{defkeyword} form has been discontinued.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3412 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3413 @chapno=11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3414 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3416 @node Numbers, Sequences, Symbols, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3417 @chapter Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3419 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3420 This section defines a few simple Common Lisp operations on numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3421 which were left out of Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3423 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3424 * Predicates on Numbers:: `plusp', `oddp', `floatp-safe', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3425 * Numerical Functions:: `abs', `expt', `floor*', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3426 * Random Numbers:: `random*', `make-random-state'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3427 * Implementation Parameters:: `most-positive-fixnum', `most-positive-float'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3428 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3430 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3431 @secno=1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3432 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3434 @node Predicates on Numbers, Numerical Functions, Numbers, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3435 @section Predicates on Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3437 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3438 These functions return @code{t} if the specified condition is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3439 true of the numerical argument, or @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3441 @defun plusp number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3442 This predicate tests whether @var{number} is positive. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3443 error if the argument is not a number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3444 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3446 @defun minusp number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3447 This predicate tests whether @var{number} is negative. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3448 error if the argument is not a number.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3449 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3451 @defun oddp integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3452 This predicate tests whether @var{integer} is odd. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3453 error if the argument is not an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3454 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3456 @defun evenp integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3457 This predicate tests whether @var{integer} is even. It is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3458 error if the argument is not an integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3459 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3461 @defun floatp-safe object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3462 This predicate tests whether @var{object} is a floating-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3463 number. On systems that support floating-point, this is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3464 to @code{floatp}. On other systems, this always returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3465 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3467 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3468 @secno=3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3469 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3471 @node Numerical Functions, Random Numbers, Predicates on Numbers, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3472 @section Numerical Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3474 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3475 These functions perform various arithmetic operations on numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3477 @defun abs number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3478 This function returns the absolute value of @var{number}. (Newer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3479 versions of Emacs provide this as a built-in function; this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3480 defines @code{abs} only for Emacs 18 versions which don't provide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3481 it as a primitive.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3482 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3484 @defun expt base power
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3485 This function returns @var{base} raised to the power of @var{number}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3486 (Newer versions of Emacs provide this as a built-in function; this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3487 package defines @code{expt} only for Emacs 18 versions which don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3488 provide it as a primitive.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3489 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3491 @defun gcd &rest integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3492 This function returns the Greatest Common Divisor of the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3493 For one argument, it returns the absolute value of that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3494 For zero arguments, it returns zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3495 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3497 @defun lcm &rest integers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3498 This function returns the Least Common Multiple of the arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3499 For one argument, it returns the absolute value of that argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3500 For zero arguments, it returns one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3501 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3503 @defun isqrt integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3504 This function computes the ``integer square root'' of its integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3505 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
3506 square root of the argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3507 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3509 @defun floor* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3510 This function implements the Common Lisp @code{floor} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3511 It is called @code{floor*} to avoid name conflicts with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3512 simpler @code{floor} function built-in to Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3514 With one argument, @code{floor*} returns a list of two numbers:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3515 The argument rounded down (toward minus infinity) to an integer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3516 and the ``remainder'' which would have to be added back to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3517 first return value to yield the argument again. If the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3518 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
3519 If the argument is an Emacs 19 floating-point number, the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3520 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
3521 0 (inclusive) and 1 (exclusive).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3522
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3523 With two arguments, @code{floor*} divides @var{number} by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3524 @var{divisor}, and returns the floor of the quotient and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3525 corresponding remainder as a list of two numbers. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3526 @code{(floor* @var{x} @var{y})} returns @code{(@var{q} @var{r})},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3527 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
3528 between 0 (inclusive) and @var{r} (exclusive). Also, note
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3529 that @code{(floor* @var{x})} is exactly equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3530 @code{(floor* @var{x} 1)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3532 This function is entirely compatible with Common Lisp's @code{floor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3533 function, except that it returns the two results in a list since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3534 Emacs Lisp does not support multiple-valued functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3535 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3537 @defun ceiling* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3538 This function implements the Common Lisp @code{ceiling} function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3539 which is analogous to @code{floor} except that it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3540 argument or quotient of the arguments up toward plus infinity.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3541 The remainder will be between 0 and minus @var{r}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3542 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3544 @defun truncate* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3545 This function implements the Common Lisp @code{truncate} function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3546 which is analogous to @code{floor} except that it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3547 argument or quotient of the arguments toward zero. Thus it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3548 equivalent to @code{floor*} if the argument or quotient is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3549 positive, or to @code{ceiling*} otherwise. The remainder has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3550 the same sign as @var{number}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3551 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3553 @defun round* number &optional divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3554 This function implements the Common Lisp @code{round} function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3555 which is analogous to @code{floor} except that it rounds the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3556 argument or quotient of the arguments to the nearest integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3557 In the case of a tie (the argument or quotient is exactly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3558 halfway between two integers), it rounds to the even integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3559 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3561 @defun mod* number divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3562 This function returns the same value as the second return value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3563 of @code{floor}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3564 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3566 @defun rem* number divisor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3567 This function returns the same value as the second return value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3568 of @code{truncate}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3569 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3571 These definitions are compatible with those in the Quiroz
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3572 @file{cl.el} package, except that this package appends @samp{*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3573 to certain function names to avoid conflicts with existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3574 Emacs 19 functions, and that the mechanism for returning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3575 multiple values is different.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3577 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3578 @secno=8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3579 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3581 @node Random Numbers, Implementation Parameters, Numerical Functions, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3582 @section Random Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3584 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3585 This package also provides an implementation of the Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3586 random number generator. It uses its own additive-congruential
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3587 algorithm, which is much more likely to give statistically clean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3588 random numbers than the simple generators supplied by many
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3589 operating systems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3591 @defun random* number &optional state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3592 This function returns a random nonnegative number less than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3593 @var{number}, and of the same type (either integer or floating-point).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3594 The @var{state} argument should be a @code{random-state} object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3595 which holds the state of the random number generator. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3596 function modifies this state object as a side effect. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3597 @var{state} is omitted, it defaults to the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3598 @code{*random-state*}, which contains a pre-initialized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3599 @code{random-state} object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3600 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3602 @defvar *random-state*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3603 This variable contains the system ``default'' @code{random-state}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3604 object, used for calls to @code{random*} that do not specify an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3605 alternative state object. Since any number of programs in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3606 Emacs process may be accessing @code{*random-state*} in interleaved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3607 fashion, the sequence generated from this variable will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3608 irreproducible for all intents and purposes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3609 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3611 @defun make-random-state &optional state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3612 This function creates or copies a @code{random-state} object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3613 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
3614 @code{*random-state*}. This is a copy in the sense that future
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3615 sequences of calls to @code{(random* @var{n})} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3616 @code{(random* @var{n} @var{s})} (where @var{s} is the new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3617 random-state object) will return identical sequences of random
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3618 numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3620 If @var{state} is a @code{random-state} object, this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3621 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
3622 function returns a new @code{random-state} object seeded from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3623 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
3624 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
3625 integer; each different integer seed will result in a completely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3626 different sequence of random numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3628 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
3629 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
3630 to use a sequence of pseudo-random numbers which can be reproduced
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3631 later for debugging, it can call @code{(make-random-state t)} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3632 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
3633 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
3634 from the file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3635 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3637 @defun random-state-p object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3638 This predicate returns @code{t} if @var{object} is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3639 @code{random-state} object, or @code{nil} otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3640 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3642 @node Implementation Parameters, , Random Numbers, Numbers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3643 @section Implementation Parameters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3645 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3646 This package defines several useful constants having to with numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3647
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3648 @defvar most-positive-fixnum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3649 This constant equals the largest value a Lisp integer can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3650 It is typically @code{2^23-1} or @code{2^25-1}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3651 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3653 @defvar most-negative-fixnum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3654 This constant equals the smallest (most negative) value a Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3655 integer can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3656 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3658 The following parameters have to do with floating-point numbers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3659 This package determines their values by exercising the computer's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3660 floating-point arithmetic in various ways. Because this operation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3661 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
3662 function that must be called before the parameters can be used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3664 @defun cl-float-limits
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3665 This function makes sure that the Common Lisp floating-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3666 parameters like @code{most-positive-float} have been initialized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3667 Until it is called, these parameters will be @code{nil}. If this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3668 version of Emacs does not support floats (e.g., most versions of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3669 Emacs 18), the parameters will remain @code{nil}. If the parameters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3670 have already been initialized, the function returns immediately.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3672 The algorithm makes assumptions that will be valid for most modern
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3673 machines, but will fail if the machine's arithmetic is extremely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3674 unusual, e.g., decimal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3675 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3677 Since true Common Lisp supports up to four different floating-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3678 precisions, it has families of constants like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3679 @code{most-positive-single-float}, @code{most-positive-double-float},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3680 @code{most-positive-long-float}, and so on. Emacs has only one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3681 floating-point precision, so this package omits the precision word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3682 from the constants' names.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3684 @defvar most-positive-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3685 This constant equals the largest value a Lisp float can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3686 For those systems whose arithmetic supports infinities, this is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3687 the largest @emph{finite} value. For IEEE machines, the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3688 is approximately @code{1.79e+308}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3689 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3691 @defvar most-negative-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3692 This constant equals the most-negative value a Lisp float can hold.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3693 (It is assumed to be equal to @code{(- most-positive-float)}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3694 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3696 @defvar least-positive-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3697 This constant equals the smallest Lisp float value greater than zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3698 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
3699 supported or @code{2.22e-308} if not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3700 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3702 @defvar least-positive-normalized-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3703 This constant equals the smallest @emph{normalized} Lisp float greater
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3704 than zero, i.e., the smallest value for which IEEE denormalization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3705 will not result in a loss of precision. For IEEE machines, this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3706 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
3707 the concept of denormalization and gradual underflow, this constant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3708 will always equal @code{least-positive-float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3709 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3711 @defvar least-negative-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3712 This constant is the negative counterpart of @code{least-positive-float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3713 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3714
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3715 @defvar least-negative-normalized-float
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3716 This constant is the negative counterpart of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3717 @code{least-positive-normalized-float}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3718 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3720 @defvar float-epsilon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3721 This constant is the smallest positive Lisp float that can be added
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3722 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
3723 will yield 1.0 again due to roundoff. For IEEE machines, epsilon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3724 is about @code{2.22e-16}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3725 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3727 @defvar float-negative-epsilon
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3728 This is the smallest positive value that can be subtracted from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3729 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
3730 @code{1.11e-16}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3731 @end defvar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3733 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3734 @chapno=13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3735 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3736
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3737 @node Sequences, Lists, Numbers, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3738 @chapter Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3739
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3740 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3741 Common Lisp defines a number of functions that operate on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3742 @dfn{sequences}, which are either lists, strings, or vectors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3743 Emacs Lisp includes a few of these, notably @code{elt} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3744 @code{length}; this package defines most of the rest.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3746 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3747 * Sequence Basics:: Arguments shared by all sequence functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3748 * Mapping over Sequences:: `mapcar*', `mapcan', `map', `every', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3749 * Sequence Functions:: `subseq', `remove*', `substitute', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3750 * Searching Sequences:: `find', `position', `count', `search', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3751 * Sorting Sequences:: `sort*', `stable-sort', `merge'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3752 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3754 @node Sequence Basics, Mapping over Sequences, Sequences, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3755 @section Sequence Basics
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3756
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 446
diff changeset
3757 @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
3758 @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
3759 specified, may appear in any order.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3760
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3761 The @code{:key} argument should be passed either @code{nil}, or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3762 function of one argument. This key function is used as a filter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3763 through which the elements of the sequence are seen; for example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3764 @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
3765 It searches for an element of the list whose @code{car} equals
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3766 @code{x}, rather than for an element which equals @code{x} itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3767 If @code{:key} is omitted or @code{nil}, the filter is effectively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3768 the identity function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3769
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3770 The @code{:test} and @code{:test-not} arguments should be either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3771 @code{nil}, or functions of two arguments. The test function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3772 used to compare two sequence elements, or to compare a search value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3773 with sequence elements. (The two values are passed to the test
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3774 function in the same order as the original sequence function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3775 arguments from which they are derived, or, if they both come from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3776 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
3777 The @code{:test} argument specifies a function which must return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3778 true (non-@code{nil}) to indicate a match; instead, you may use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3779 @code{:test-not} to give a function which returns @emph{false} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3780 indicate a match. The default test function is @code{:test 'eql}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3781
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3782 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
3783 arguments also come in @code{-if} and @code{-if-not} varieties,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3784 where a @var{predicate} function is passed instead of @var{item},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3785 and sequence elements match if the predicate returns true on them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3786 (or false in the case of @code{-if-not}). For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3787
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3788 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3789 (remove* 0 seq :test '=) @equiv{} (remove-if 'zerop seq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3790 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3792 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3793 to remove all zeros from sequence @code{seq}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3795 Some operations can work on a subsequence of the argument sequence;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3796 these function take @code{:start} and @code{:end} arguments which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3797 default to zero and the length of the sequence, respectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3798 Only elements between @var{start} (inclusive) and @var{end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3799 (exclusive) are affected by the operation. The @var{end} argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3800 may be passed @code{nil} to signify the length of the sequence;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3801 otherwise, both @var{start} and @var{end} must be integers, with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3802 @code{0 <= @var{start} <= @var{end} <= (length @var{seq})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3803 If the function takes two sequence arguments, the limits are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3804 defined by keywords @code{:start1} and @code{:end1} for the first,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3805 and @code{:start2} and @code{:end2} for the second.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3807 A few functions accept a @code{:from-end} argument, which, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3808 non-@code{nil}, causes the operation to go from right-to-left
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3809 through the sequence instead of left-to-right, and a @code{:count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3810 argument, which specifies an integer maximum number of elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3811 to be removed or otherwise processed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3813 The sequence functions make no guarantees about the order in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3814 which the @code{:test}, @code{:test-not}, and @code{:key} functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3815 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
3816 on side effects of these functions. For example, @code{:from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3817 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
3818 be scanned forwards but computing a result ``as if'' it were scanned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3819 backwards. (Some functions, like @code{mapcar*} and @code{every},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3820 @emph{do} specify exactly the order in which the function is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3821 so side effects are perfectly acceptable in those cases.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3822
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3823 Strings in GNU Emacs 19 may contain ``text properties'' as well
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3824 as character data. Except as noted, it is undefined whether or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3825 not text properties are preserved by sequence functions. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3826 example, @code{(remove* ?A @var{str})} may or may not preserve
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3827 the properties of the characters copied from @var{str} into the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3828 result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3829
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3830 @node Mapping over Sequences, Sequence Functions, Sequence Basics, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3831 @section Mapping over Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3833 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3834 These functions ``map'' the function you specify over the elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3835 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
3836 built-in function @code{mapcar}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3837
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3838 @defun mapcar* function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3839 This function calls @var{function} on successive parallel sets of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3840 elements from its argument sequences. Given a single @var{seq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3841 argument it is equivalent to @code{mapcar}; given @var{n} sequences,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3842 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
3843 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
3844 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
3845 soon as the shortest sequence runs out. The argument sequences may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3846 be any mixture of lists, strings, and vectors; the return sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3847 is always a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3849 Common Lisp's @code{mapcar} accepts multiple arguments but works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3850 only on lists; Emacs Lisp's @code{mapcar} accepts a single sequence
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3851 argument. This package's @code{mapcar*} works as a compatible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3852 superset of both.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3853 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3855 @defun map result-type function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3856 This function maps @var{function} over the argument sequences,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3857 just like @code{mapcar*}, but it returns a sequence of type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3858 @var{result-type} rather than a list. @var{result-type} must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3859 be one of the following symbols: @code{vector}, @code{string},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3860 @code{list} (in which case the effect is the same as for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3861 @code{mapcar*}), or @code{nil} (in which case the results are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3862 thrown away and @code{map} returns @code{nil}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3863 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3864
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3865 @defun maplist function list &rest more-lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3866 This function calls @var{function} on each of its argument lists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3867 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
3868 shortest list runs out. The results are returned in the form
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3869 of a list. Thus, @code{maplist} is like @code{mapcar*} except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3870 that it passes in the list pointers themselves rather than the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3871 @code{car}s of the advancing pointers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3872 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3874 @defun mapc function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3875 This function is like @code{mapcar*}, except that the values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3876 returned by @var{function} are ignored and thrown away rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3877 than being collected into a list. The return value of @code{mapc}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3878 is @var{seq}, the first sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3879 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3880
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3881 @defun mapl function list &rest more-lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3882 This function is like @code{maplist}, except that it throws away
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3883 the values returned by @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3884 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3886 @defun mapcan function seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3887 This function is like @code{mapcar*}, except that it concatenates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3888 the return values (which must be lists) using @code{nconc},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3889 rather than simply collecting them into a list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3890 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3892 @defun mapcon function list &rest more-lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3893 This function is like @code{maplist}, except that it concatenates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3894 the return values using @code{nconc}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3895 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3896
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3897 @defun some predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3898 This function calls @var{predicate} on each element of @var{seq}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3899 in turn; if @var{predicate} returns a non-@code{nil} value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3900 @code{some} returns that value, otherwise it returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3901 Given several sequence arguments, it steps through the sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3902 in parallel until the shortest one runs out, just as in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3903 @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
3904 the elements are visited, and on the fact that mapping stops
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3905 immediately as soon as @var{predicate} returns non-@code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3906 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3907
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3908 @defun every predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3909 This function calls @var{predicate} on each element of the sequence(s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3910 in turn; it returns @code{nil} as soon as @var{predicate} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3911 @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
3912 for all elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3913 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3914
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3915 @defun notany predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3916 This function calls @var{predicate} on each element of the sequence(s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3917 in turn; it returns @code{nil} as soon as @var{predicate} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3918 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
3919 was @code{nil} for all elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3920 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3921
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3922 @defun notevery predicate seq &rest more-seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3923 This function calls @var{predicate} on each element of the sequence(s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3924 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
3925 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
3926 true for all elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3927 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3929 @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
3930 This function combines the elements of @var{seq} using an associative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3931 binary operation. Suppose @var{function} is @code{*} and @var{seq} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3932 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
3933 combined with @code{(* 2 3) = 6}; this is combined with the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3934 element, @code{(* 6 4) = 24}, and that is combined with the final
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3935 element: @code{(* 24 5) = 120}. Note that the @code{*} function happens
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3936 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
3937 an explicit call to @code{reduce}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3939 If @code{:from-end} is true, the reduction is right-associative instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3940 of left-associative:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3942 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3943 (reduce '- '(1 2 3 4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3944 @equiv{} (- (- (- 1 2) 3) 4) @result{} -8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3945 (reduce '- '(1 2 3 4) :from-end t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3946 @equiv{} (- 1 (- 2 (- 3 4))) @result{} -2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3947 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3948
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3949 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
3950 is called on each of the sequence elements in turn.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3952 If @code{:initial-value} is specified, it is effectively added to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3953 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
3954 The @code{:key} function is @emph{not} applied to the initial value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3955
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3956 If the sequence, including the initial value, has exactly one element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3957 then that element is returned without ever calling @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3958 If the sequence is empty (and there is no initial value), then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3959 @var{function} is called with no arguments to obtain the return value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3960 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3962 All of these mapping operations can be expressed conveniently in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3963 terms of the @code{loop} macro. In compiled code, @code{loop} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3964 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
3965 function calls.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3967 @node Sequence Functions, Searching Sequences, Mapping over Sequences, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3968 @section Sequence Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3969
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3970 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3971 This section describes a number of Common Lisp functions for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3972 operating on sequences.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3974 @defun subseq sequence start &optional end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3975 This function returns a given subsequence of the argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3976 @var{sequence}, which may be a list, string, or vector.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3977 The indices @var{start} and @var{end} must be in range, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3978 @var{start} must be no greater than @var{end}. If @var{end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3979 is omitted, it defaults to the length of the sequence. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3980 return value is always a copy; it does not share structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3981 with @var{sequence}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3983 As an extension to Common Lisp, @var{start} and/or @var{end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3984 may be negative, in which case they represent a distance back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3985 from the end of the sequence. This is for compatibility with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3986 Emacs' @code{substring} function. Note that @code{subseq} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3987 the @emph{only} sequence function that allows negative
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3988 @var{start} and @var{end}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3990 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
3991 specified range of elements with elements from another sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3992 The replacement is done as if by @code{replace}, described below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3993 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3995 @defun concatenate result-type &rest seqs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3996 This function concatenates the argument sequences together to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3997 form a result sequence of type @var{result-type}, one of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3998 symbols @code{vector}, @code{string}, or @code{list}. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3999 arguments are always copied, even in cases such as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4000 @code{(concatenate 'list '(1 2 3))} where the result is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4001 identical to an argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4002 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4004 @defun fill seq item @t{&key :start :end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4005 This function fills the elements of the sequence (or the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4006 part of the sequence) with the value @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4007 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4008
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4009 @defun replace seq1 seq2 @t{&key :start1 :end1 :start2 :end2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4010 This function copies part of @var{seq2} into part of @var{seq1}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4011 The sequence @var{seq1} is not stretched or resized; the amount
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4012 of data copied is simply the shorter of the source and destination
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4013 (sub)sequences. The function returns @var{seq1}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4015 If @var{seq1} and @var{seq2} are @code{eq}, then the replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4016 will work correctly even if the regions indicated by the start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4017 and end arguments overlap. However, if @var{seq1} and @var{seq2}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4018 are lists which share storage but are not @code{eq}, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4019 start and end arguments specify overlapping regions, the effect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4020 is undefined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4021 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4023 @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
4024 This returns a copy of @var{seq} with all elements matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4025 @var{item} removed. The result may share storage with or be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4026 @code{eq} to @var{seq} in some circumstances, but the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4027 @var{seq} will not be modified. The @code{:test}, @code{:test-not},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4028 and @code{:key} arguments define the matching test that is used;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4029 by default, elements @code{eql} to @var{item} are removed. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4030 @code{:count} argument specifies the maximum number of matching
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4031 elements that can be removed (only the leftmost @var{count} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4032 are removed). The @code{:start} and @code{:end} arguments specify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4033 a region in @var{seq} in which elements will be removed; elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4034 outside that region are not matched or removed. The @code{:from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4035 argument, if true, says that elements should be deleted from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4036 end of the sequence rather than the beginning (this matters only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4037 if @var{count} was also specified).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4038 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4039
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4040 @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
4041 This deletes all elements of @var{seq} which match @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4042 It is a destructive operation. Since Emacs Lisp does not support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4043 stretchable strings or vectors, this is the same as @code{remove*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4044 for those sequence types. On lists, @code{remove*} will copy the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4045 list if necessary to preserve the original list, whereas
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4046 @code{delete*} will splice out parts of the argument list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4047 Compare @code{append} and @code{nconc}, which are analogous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4048 non-destructive and destructive list operations in Emacs Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4049 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4051 @findex remove-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4052 @findex remove-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4053 @findex delete-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4054 @findex delete-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4055 The predicate-oriented functions @code{remove-if}, @code{remove-if-not},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4056 @code{delete-if}, and @code{delete-if-not} are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4058 @defun delete item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4059 This MacLisp-compatible function deletes from @var{list} all elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4060 which are @code{equal} to @var{item}. The @code{delete} function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4061 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
4062 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4064 @defun remove item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4065 This function removes from @var{list} all elements which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4066 @code{equal} to @var{item}. This package defines it for symmetry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4067 with @code{delete}, even though @code{remove} is not built-in to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4068 Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4069 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4071 @defun remq item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4072 This function removes from @var{list} all elements which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4073 @code{eq} to @var{item}. This package defines it for symmetry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4074 with @code{delq}, even though @code{remq} is not built-in to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4075 Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4076 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4078 @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
4079 This function returns a copy of @var{seq} with duplicate elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4080 removed. Specifically, if two elements from the sequence match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4081 according to the @code{:test}, @code{:test-not}, and @code{:key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4082 arguments, only the rightmost one is retained. If @code{:from-end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4083 is true, the leftmost one is retained instead. If @code{:start} or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4084 @code{:end} is specified, only elements within that subsequence are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4085 examined or removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4086 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4088 @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
4089 This function deletes duplicate elements from @var{seq}. It is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4090 a destructive version of @code{remove-duplicates}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4091 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4092
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4093 @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
4094 This function returns a copy of @var{seq}, with all elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4095 matching @var{old} replaced with @var{new}. The @code{:count},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4096 @code{:start}, @code{:end}, and @code{:from-end} arguments may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4097 used to limit the number of substitutions made.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4098 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4100 @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
4101 This is a destructive version of @code{substitute}; it performs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4102 the substitution using @code{setcar} or @code{aset} rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4103 by returning a changed copy of the sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4104 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4105
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4106 @findex substitute-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4107 @findex substitute-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4108 @findex nsubstitute-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4109 @findex nsubstitute-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4110 The @code{substitute-if}, @code{substitute-if-not}, @code{nsubstitute-if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4111 and @code{nsubstitute-if-not} functions are defined similarly. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4112 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
4113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4114 @node Searching Sequences, Sorting Sequences, Sequence Functions, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4115 @section Searching Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4117 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4118 These functions search for elements or subsequences in a sequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4119 (See also @code{member*} and @code{assoc*}; @pxref{Lists}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4121 @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
4122 This function searches @var{seq} for an element matching @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4123 If it finds a match, it returns the matching element. Otherwise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4124 it returns @code{nil}. It returns the leftmost match, unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4125 @code{:from-end} is true, in which case it returns the rightmost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4126 match. The @code{:start} and @code{:end} arguments may be used to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4127 limit the range of elements that are searched.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4128 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4130 @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
4131 This function is like @code{find}, except that it returns the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4132 integer position in the sequence of the matching item rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4133 the item itself. The position is relative to the start of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4134 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
4135 returns @code{nil} if no matching element was found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4136 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4138 @defun count item seq @t{&key :test :test-not :key :start :end}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4139 This function returns the number of elements of @var{seq} which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4140 match @var{item}. The result is always a nonnegative integer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4141 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4143 @findex find-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4144 @findex find-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4145 @findex position-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4146 @findex position-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4147 @findex count-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4148 @findex count-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4149 The @code{find-if}, @code{find-if-not}, @code{position-if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4150 @code{position-if-not}, @code{count-if}, and @code{count-if-not}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4151 functions are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4153 @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
4154 This function compares the specified parts of @var{seq1} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4155 @var{seq2}. If they are the same length and the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4156 elements match (according to @code{:test}, @code{:test-not},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4157 and @code{:key}), the function returns @code{nil}. If there is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4158 a mismatch, the function returns the index (relative to @var{seq1})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4159 of the first mismatching element. This will be the leftmost pair of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4160 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
4161 the two otherwise-matching sequences runs out.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4163 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
4164 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
4165 If the sequences differ, then one plus the index of the rightmost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4166 difference (relative to @var{seq1}) is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4168 An interesting example is @code{(mismatch str1 str2 :key 'upcase)},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4169 which compares two strings case-insensitively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4170 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4172 @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
4173 This function searches @var{seq2} for a subsequence that matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4174 @var{seq1} (or part of it specified by @code{:start1} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4175 @code{:end1}.) Only matches which fall entirely within the region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4176 defined by @code{:start2} and @code{:end2} will be considered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4177 The return value is the index of the leftmost element of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4178 leftmost match, relative to the start of @var{seq2}, or @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4179 if no matches were found. If @code{:from-end} is true, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4180 function finds the @emph{rightmost} matching subsequence.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4181 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4183 @node Sorting Sequences, , Searching Sequences, Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4184 @section Sorting Sequences
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4186 @defun sort* seq predicate @t{&key :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4187 This function sorts @var{seq} into increasing order as determined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4188 by using @var{predicate} to compare pairs of elements. @var{predicate}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4189 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
4190 is less than (not equal to) its second argument. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4191 @code{<} and @code{string-lessp} are suitable predicate functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4192 for sorting numbers and strings, respectively; @code{>} would sort
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4193 numbers into decreasing rather than increasing order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4195 This function differs from Emacs' built-in @code{sort} in that it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4196 can operate on any type of sequence, not just lists. Also, it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4197 accepts a @code{:key} argument which is used to preprocess data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4198 fed to the @var{predicate} function. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4200 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4201 (setq data (sort data 'string-lessp :key 'downcase))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4202 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4204 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4205 sorts @var{data}, a sequence of strings, into increasing alphabetical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4206 order without regard to case. A @code{:key} function of @code{car}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4207 would be useful for sorting association lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4209 The @code{sort*} function is destructive; it sorts lists by actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4210 rearranging the @code{cdr} pointers in suitable fashion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4211 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4213 @defun stable-sort seq predicate @t{&key :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4214 This function sorts @var{seq} @dfn{stably}, meaning two elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4215 which are equal in terms of @var{predicate} are guaranteed not to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4216 be rearranged out of their original order by the sort.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4218 In practice, @code{sort*} and @code{stable-sort} are equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4219 in Emacs Lisp because the underlying @code{sort} function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4220 stable by default. However, this package reserves the right to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4221 use non-stable methods for @code{sort*} in the future.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4222 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4224 @defun merge type seq1 seq2 predicate @t{&key :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4225 This function merges two sequences @var{seq1} and @var{seq2} by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4226 interleaving their elements. The result sequence, of type @var{type}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4227 (in the sense of @code{concatenate}), has length equal to the sum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4228 of the lengths of the two input sequences. The sequences may be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4229 modified destructively. Order of elements within @var{seq1} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4230 @var{seq2} is preserved in the interleaving; elements of the two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4231 sequences are compared by @var{predicate} (in the sense of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4232 @code{sort}) and the lesser element goes first in the result.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4233 When elements are equal, those from @var{seq1} precede those from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4234 @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
4235 both sorted according to @var{predicate}, then the result will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4236 a merged sequence which is (stably) sorted according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4237 @var{predicate}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4238 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4240 @node Lists, Hash Tables, Sequences, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4241 @chapter Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4243 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4244 The functions described here operate on lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4246 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4247 * List Functions:: `caddr', `first', `last', `list*', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4248 * Substitution of Expressions:: `subst', `sublis', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4249 * Lists as Sets:: `member*', `adjoin', `union', etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4250 * Association Lists:: `assoc*', `rassoc*', `acons', `pairlis'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4251 @end menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4253 @node List Functions, Substitution of Expressions, Lists, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4254 @section List Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4256 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4257 This section describes a number of simple operations on lists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4258 i.e., chains of cons cells.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4260 @defun caddr x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4261 This function is equivalent to @code{(car (cdr (cdr @var{x})))}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4262 Likewise, this package defines all 28 @code{c@var{xxx}r} functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4263 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
4264 All of these functions are @code{setf}-able, and calls to them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4265 are expanded inline by the byte-compiler for maximum efficiency.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4266 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4267
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4268 @defun first x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4269 This function is a synonym for @code{(car @var{x})}. Likewise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4270 the functions @code{second}, @code{third}, @dots{}, through
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4271 @code{tenth} return the given element of the list @var{x}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4272 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4274 @defun rest x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4275 This function is a synonym for @code{(cdr @var{x})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4276 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4278 @defun endp x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4279 Common Lisp defines this function to act like @code{null}, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4280 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
4281 cons cell. This package simply defines @code{endp} as a synonym
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4282 for @code{null}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4283 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4285 @defun list-length x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4286 This function returns the length of list @var{x}, exactly like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4287 @code{(length @var{x})}, except that if @var{x} is a circular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4288 list (where the cdr-chain forms a loop rather than terminating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4289 with @code{nil}), this function returns @code{nil}. (The regular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4290 @code{length} function would get stuck if given a circular list.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4291 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4293 @defun last x &optional n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4294 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
4295 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
4296 The ``last cons'' means the first cons cell of the list whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4297 @code{cdr} is not another cons cell. (For normal lists, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4298 @code{cdr} of the last cons will be @code{nil}.) This function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4299 returns @code{nil} if @var{x} is @code{nil} or shorter than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4300 @var{n}. Note that the last @emph{element} of the list is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4301 @code{(car (last @var{x}))}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4302 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4303
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4304 @defun butlast x &optional n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4305 This function returns the list @var{x} with the last element,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4306 or the last @var{n} elements, removed. If @var{n} is greater
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4307 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
4308 original list. In general, @code{(append (butlast @var{x} @var{n})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4309 (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
4310 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4312 @defun nbutlast x &optional n
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4313 This is a version of @code{butlast} that works by destructively
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4314 modifying the @code{cdr} of the appropriate element, rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4315 making a copy of the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4316 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4318 @defun list* arg &rest others
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4319 This function constructs a list of its arguments. The final
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4320 argument becomes the @code{cdr} of the last cell constructed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4321 Thus, @code{(list* @var{a} @var{b} @var{c})} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4322 @code{(cons @var{a} (cons @var{b} @var{c}))}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4323 @code{(list* @var{a} @var{b} nil)} is equivalent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4324 @code{(list @var{a} @var{b})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4326 (Note that this function really is called @code{list*} in Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4327 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
4328 or @code{defun*}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4329 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4330
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4331 @defun ldiff list sublist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4332 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
4333 one of the cons cells of @var{list}, then this function returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4334 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
4335 @var{sublist}. For example, @code{(ldiff x (cddr x))} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4336 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
4337 copy; the original @var{list} is not modified. If @var{sublist}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4338 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
4339 is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4340 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4342 @defun copy-list list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4343 This function returns a copy of the list @var{list}. It copies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4344 dotted lists like @code{(1 2 . 3)} correctly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4345 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4347 @defun copy-tree x &optional vecp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4348 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
4349 Unlike @code{copy-sequence} (and its alias @code{copy-list}),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4350 which copies only along the @code{cdr} direction, this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4351 copies (recursively) along both the @code{car} and the @code{cdr}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4352 directions. If @var{x} is not a cons cell, the function simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4353 returns @var{x} unchanged. If the optional @var{vecp} argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4354 is true, this function copies vectors (recursively) as well as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4355 cons cells.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4356 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4358 @defun tree-equal x y @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4359 This function compares two trees of cons cells. If @var{x} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4360 @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
4361 compared recursively. If neither @var{x} nor @var{y} is a cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4362 cell, they are compared by @code{eql}, or according to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4363 specified test. The @code{:key} function, if specified, is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4364 applied to the elements of both trees. @xref{Sequences}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4365 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4367 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4368 @secno=3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4369 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4371 @node Substitution of Expressions, Lists as Sets, List Functions, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4372 @section Substitution of Expressions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4374 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4375 These functions substitute elements throughout a tree of cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4376 cells. (@xref{Sequence Functions}, for the @code{substitute}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4377 function, which works on just the top-level elements of a list.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4379 @defun subst new old tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4380 This function substitutes occurrences of @var{old} with @var{new}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4381 in @var{tree}, a tree of cons cells. It returns a substituted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4382 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
4383 the argument @var{tree} in parts where no substitutions occurred.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4384 The original @var{tree} is not modified. This function recurses
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4385 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
4386 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
4387 then matching cells in the tree are substituted as usual without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4388 recursively substituting in that cell. Comparisons with @var{old}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4389 are done according to the specified test (@code{eql} by default).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4390 The @code{:key} function is applied to the elements of the tree
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4391 but not to @var{old}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4392 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4394 @defun nsubst new old tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4395 This function is like @code{subst}, except that it works by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4396 destructive modification (by @code{setcar} or @code{setcdr})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4397 rather than copying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4398 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4400 @findex subst-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4401 @findex subst-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4402 @findex nsubst-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4403 @findex nsubst-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4404 The @code{subst-if}, @code{subst-if-not}, @code{nsubst-if}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4405 @code{nsubst-if-not} functions are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4407 @defun sublis alist tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4408 This function is like @code{subst}, except that it takes an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4409 association list @var{alist} of @var{old}-@var{new} pairs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4410 Each element of the tree (after applying the @code{:key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4411 function, if any), is compared with the @code{car}s of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4412 @var{alist}; if it matches, it is replaced by the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4413 @code{cdr}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4414 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4416 @defun nsublis alist tree @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4417 This is a destructive version of @code{sublis}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4418 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4420 @node Lists as Sets, Association Lists, Substitution of Expressions, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4421 @section Lists as Sets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4423 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4424 These functions perform operations on lists which represent sets
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4425 of elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4427 @defun member item list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4428 This MacLisp-compatible function searches @var{list} for an element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4429 which is @code{equal} to @var{item}. The @code{member} function is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4430 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
4431 See the following function for a Common-Lisp compatible version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4432 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4434 @defun member* item list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4435 This function searches @var{list} for an element matching @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4436 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
4437 the matching element. Otherwise, it returns @code{nil}. Elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4438 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
4439 @code{:test-not}, and @code{:key} arguments to modify this behavior.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4440 @xref{Sequences}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4442 Note that this function's name is suffixed by @samp{*} to avoid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4443 the incompatible @code{member} function defined in Emacs 19.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4444 (That function uses @code{equal} for comparisons; it is equivalent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4445 to @code{(member* @var{item} @var{list} :test 'equal)}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4446 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4448 @findex member-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4449 @findex member-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4450 The @code{member-if} and @code{member-if-not} functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4451 analogously search for elements which satisfy a given predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4453 @defun tailp sublist list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4454 This function returns @code{t} if @var{sublist} is a sublist of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4455 @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
4456 any of its @code{cdr}s.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4457 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4459 @defun adjoin item list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4460 This function conses @var{item} onto the front of @var{list},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4461 like @code{(cons @var{item} @var{list})}, but only if @var{item}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4462 is not already present on the list (as determined by @code{member*}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4463 If a @code{:key} argument is specified, it is applied to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4464 @var{item} as well as to the elements of @var{list} during
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4465 the search, on the reasoning that @var{item} is ``about'' to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4466 become part of the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4467 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4469 @defun union list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4470 This function combines two lists which represent sets of items,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4471 returning a list that represents the union of those two sets.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4472 The result list will contain all items which appear in @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4473 or @var{list2}, and no others. If an item appears in both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4474 @var{list1} and @var{list2} it will be copied only once. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4475 an item is duplicated in @var{list1} or @var{list2}, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4476 undefined whether or not that duplication will survive in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4477 result list. The order of elements in the result list is also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4478 undefined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4479 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4481 @defun nunion list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4482 This is a destructive version of @code{union}; rather than copying,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4483 it tries to reuse the storage of the argument lists if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4484 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4486 @defun intersection list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4487 This function computes the intersection of the sets represented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4488 by @var{list1} and @var{list2}. It returns the list of items
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4489 which appear in both @var{list1} and @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4490 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4492 @defun nintersection list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4493 This is a destructive version of @code{intersection}. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4494 tries to reuse storage of @var{list1} rather than copying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4495 It does @emph{not} reuse the storage of @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4496 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4497
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4498 @defun set-difference list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4499 This function computes the ``set difference'' of @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4500 and @var{list2}, i.e., the set of elements that appear in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4501 @var{list1} but @emph{not} in @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4502 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4504 @defun nset-difference list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4505 This is a destructive @code{set-difference}, which will try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4506 to reuse @var{list1} if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4507 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4509 @defun set-exclusive-or list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4510 This function computes the ``set exclusive or'' of @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4511 and @var{list2}, i.e., the set of elements that appear in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4512 exactly one of @var{list1} and @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4513 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4515 @defun nset-exclusive-or list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4516 This is a destructive @code{set-exclusive-or}, which will try
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4517 to reuse @var{list1} and @var{list2} if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4518 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4520 @defun subsetp list1 list2 @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4521 This function checks whether @var{list1} represents a subset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4522 of @var{list2}, i.e., whether every element of @var{list1}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4523 also appears in @var{list2}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4524 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4526 @node Association Lists, , Lists as Sets, Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4527 @section Association Lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4529 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4530 An @dfn{association list} is a list representing a mapping from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4531 one set of values to another; any list whose elements are cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4532 cells is an association list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4534 @defun assoc* item a-list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4535 This function searches the association list @var{a-list} for an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4536 element whose @code{car} matches (in the sense of @code{:test},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4537 @code{:test-not}, and @code{:key}, or by comparison with @code{eql})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4538 a given @var{item}. It returns the matching element, if any,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4539 otherwise @code{nil}. It ignores elements of @var{a-list} which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4540 are not cons cells. (This corresponds to the behavior of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4541 @code{assq} and @code{assoc} in Emacs Lisp; Common Lisp's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4542 @code{assoc} ignores @code{nil}s but considers any other non-cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4543 elements of @var{a-list} to be an error.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4544 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4546 @defun rassoc* item a-list @t{&key :test :test-not :key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4547 This function searches for an element whose @code{cdr} matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4548 @var{item}. If @var{a-list} represents a mapping, this applies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4549 the inverse of the mapping to @var{item}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4550 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4552 @defun rassoc item a-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4553 This function searches like @code{rassoc*} with a @code{:test}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4554 argument of @code{equal}. It is analogous to Emacs Lisp's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4555 standard @code{assoc} function, which derives from the MacLisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4556 rather than the Common Lisp tradition.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4557 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4559 @findex assoc-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4560 @findex assoc-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4561 @findex rassoc-if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4562 @findex rassoc-if-not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4563 The @code{assoc-if}, @code{assoc-if-not}, @code{rassoc-if},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4564 and @code{rassoc-if-not} functions are defined similarly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4565
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4566 Two simple functions for constructing association lists are:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4568 @defun acons key value alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4569 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
4570 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4572 @defun pairlis keys values &optional alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4573 This is equivalent to @code{(nconc (mapcar* 'cons @var{keys} @var{values})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4574 @var{alist})}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4575 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4577 @node Hash Tables, Structures, Lists, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4578 @chapter Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4580 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4581 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
4582 @ref{Hash Tables,,, lispref, XEmacs Lisp Reference Manual}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4584 @ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4585 A @dfn{hash table} is a data structure that maps ``keys'' onto
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4586 ``values.'' Keys and values can be arbitrary Lisp data objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4587 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
4588 key is roughly constant; simpler data structures like association
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4589 lists take time proportional to the number of entries in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4591 @defun make-hash-table @t{&key :test :size}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4592 This function creates and returns a hash-table object whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4593 function for comparing elements is @code{:test} (@code{eql}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4594 by default), and which is allocated to fit about @code{:size}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4595 elements. The @code{:size} argument is purely advisory; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4596 table will stretch automatically if you store more elements in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4597 it. If @code{:size} is omitted, a reasonable default is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4599 Common Lisp allows only @code{eq}, @code{eql}, @code{equal},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4600 and @code{equalp} as legal values for the @code{:test} argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4601 In this package, any reasonable predicate function will work,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4602 though if you use something else you should check the details of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4603 the hashing function described below to make sure it is suitable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4604 for your predicate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4606 Some versions of Emacs (like XEmacs) include a built-in hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4607 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
4608 @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
4609 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
4610 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
4611 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
4612 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
4613 being used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4615 This function accepts the additional Common Lisp keywords
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4616 @code{:rehash-size} and @code{:rehash-threshold}, but it ignores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4617 their values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4618 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4620 @defun gethash key table &optional default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4621 This function looks up @var{key} in @var{table}. If @var{key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4622 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
4623 keys according to the table's test function, then the associated value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4624 is returned. Otherwise, @var{default} (or @code{nil}) is returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4625
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4626 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
4627 @code{gethash}. If @var{key} already exists in the table, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4628 corresponding value is changed to the stored value. If @var{key}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4629 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
4630 table is reallocated to a larger size if necessary. The @var{default}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4631 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
4632 exactly analogous to that of @code{get}; @pxref{Property Lists}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4633 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4635 @defun remhash key table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4636 This function removes the entry for @var{key} from @var{table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4637 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
4638 not appear in the table, it does nothing and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4639 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4641 @defun clrhash table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4642 This function removes all the entries from @var{table}, leaving
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4643 an empty hash table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4644 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4646 @defun maphash function table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4647 This function calls @var{function} for each entry in @var{table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4648 It passes two arguments to @var{function}, the key and the value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4649 of the given entry. The return value of @var{function} is ignored;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4650 @var{maphash} itself returns @code{nil}. @xref{Loop Facility}, for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4651 an alternate way of iterating over hash tables.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4652 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4654 @defun hash-table-count table This function returns the number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4655 entries in @var{table}. @strong{Warning:} The current implementation of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4656 XEmacs hash-tables does not decrement the stored @code{count}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4657 when @code{remhash} removes an entry. Therefore, the return value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4658 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
4659 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
4660 A slower, but reliable, way to count the entries is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4661 @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
4662 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4664 @defun hash-table-p object This function returns @code{t} if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4665 @var{object} is a hash table, @code{nil} otherwise. It recognizes both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4666 types of hash tables (both XEmacs built-in tables and tables implemented
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4667 with special lists.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4668 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4670 Sometimes when dealing with hash tables it is useful to know the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4671 exact ``hash function'' that is used. This package implements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4672 hash tables using Emacs Lisp ``obarrays,'' which are the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4673 data structure that Emacs Lisp uses to keep track of symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4674 Each hash table includes an embedded obarray. Key values given
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4675 to @code{gethash} are converted by various means into strings,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4676 which are then looked up in the obarray using @code{intern} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4677 @code{intern-soft}. The symbol, or ``bucket,'' corresponding to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4678 a given key string includes as its @code{symbol-value} an association
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4679 list of all key-value pairs which hash to that string. Depending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4680 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
4681 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
4682 symbol @code{foo} and two separately built strings @code{"foo"} will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4683 create three entries in the same bucket. Search time is linear
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4684 within buckets, so hash tables will be most effective if you arrange
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4685 not to store too many things that hash the same.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4687 The following algorithm is used to convert Lisp objects to hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4688 strings:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4689
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4690 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4691 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4692 Strings are used directly as hash strings. (However, if the test
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4693 function is @code{equalp}, strings are @code{downcase}d first.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4695 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4696 Symbols are hashed according to their @code{symbol-name}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4698 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4699 Integers are hashed into one of 16 buckets depending on their value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4700 modulo 16. Floating-point numbers are truncated to integers and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4701 hashed modulo 16.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4702
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4703 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4704 Cons cells are hashed according to their @code{car}s; nonempty vectors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4705 are hashed according to their first element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4706
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4707 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4708 All other types of objects hash into a single bucket named @code{"*"}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4709 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4711 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4712 Thus, for example, searching among many buffer objects in a hash table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4713 will devolve to a (still fairly fast) linear-time search through a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4714 single bucket, whereas searching for different symbols will be very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4715 fast since each symbol will, in general, hash into its own bucket.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4716
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4717 The size of the obarray in a hash table is automatically adjusted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4718 as the number of elements increases.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4720 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
4721 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
4722 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
4723 structure will be more efficient since lookup does not require
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4724 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
4725 However, such tables are guaranteed to take time proportional to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4726 their size to do a search.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4727 @end ignore
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4729 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4730 @chapno=18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4731 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4732
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4733 @node Structures, Assertions, Hash Tables, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4734 @chapter Structures
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4736 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4737 The Common Lisp @dfn{structure} mechanism provides a general way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4738 to define data types similar to C's @code{struct} types. A
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4739 structure is a Lisp object containing some number of @dfn{slots},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4740 each of which can hold any Lisp data object. Functions are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4741 provided for accessing and setting the slots, creating or copying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4742 structure objects, and recognizing objects of a particular structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4743 type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4744
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4745 In true Common Lisp, each structure type is a new type distinct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4746 from all existing Lisp types. Since the underlying Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4747 system provides no way to create new distinct types, this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4748 implements structures as vectors (or lists upon request) with a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4749 special ``tag'' symbol to identify them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4751 @defspec defstruct name slots@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4752 The @code{defstruct} form defines a new structure type called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4753 @var{name}, with the specified @var{slots}. (The @var{slots}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4754 may begin with a string which documents the structure type.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4755 In the simplest case, @var{name} and each of the @var{slots}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4756 are symbols. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4757
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4758 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4759 (defstruct person name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4760 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4761
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4762 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4763 defines a struct type called @code{person} which contains three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4764 slots. Given a @code{person} object @var{p}, you can access those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4765 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
4766 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
4767 using @code{setf} on any of these place forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4769 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4770 (incf (person-age birthday-boy))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4771 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4773 You can create a new @code{person} by calling @code{make-person},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4774 which takes keyword arguments @code{:name}, @code{:age}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4775 @code{:sex} to specify the initial values of these slots in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4776 new object. (Omitting any of these arguments leaves the corresponding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4777 slot ``undefined,'' according to the Common Lisp standard; in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4778 Lisp, such uninitialized slots are filled with @code{nil}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4779
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4780 Given a @code{person}, @code{(copy-person @var{p})} makes a new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4781 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
4782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4783 Given any Lisp object @var{x}, @code{(person-p @var{x})} returns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4784 true if @var{x} looks like a @code{person}, false otherwise. (Again,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4785 in Common Lisp this predicate would be exact; in Emacs Lisp the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4786 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
4787 length which starts with the correct tag symbol.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4789 Accessors like @code{person-name} normally check their arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4790 (effectively using @code{person-p}) and signal an error if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4791 argument is the wrong type. This check is affected by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4792 @code{(optimize (safety @dots{}))} declarations. Safety level 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4793 the default, uses a somewhat optimized check that will detect all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4794 incorrect arguments, but may use an uninformative error message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4795 (e.g., ``expected a vector'' instead of ``expected a @code{person}'').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4796 Safety level 0 omits all checks except as provided by the underlying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4797 @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
4798 always print a descriptive error message for incorrect inputs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4799 @xref{Declarations}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4800
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4801 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4802 (setq dave (make-person :name "Dave" :sex 'male))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4803 @result{} [cl-struct-person "Dave" nil male]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4804 (setq other (copy-person dave))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4805 @result{} [cl-struct-person "Dave" nil male]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4806 (eq dave other)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4807 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4808 (eq (person-name dave) (person-name other))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4809 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4810 (person-p dave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4811 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4812 (person-p [1 2 3 4])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4813 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4814 (person-p "Bogus")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4815 @result{} nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4816 (person-p '[cl-struct-person counterfeit person object])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4817 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4818 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4820 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
4821 symbol followed by any number of @dfn{struct options}; each @var{slot}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4822 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
4823 @var{default-value} @var{slot-options}@dots{})}. The @var{default-value}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4824 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
4825 structure type is created without specifying that slot's value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4827 Common Lisp defines several slot options, but the only one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4828 implemented in this package is @code{:read-only}. A non-@code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4829 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
4830 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
4831 not change afterward.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4832
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4833 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4834 (defstruct person
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4835 (name nil :read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4836 age
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4837 (sex 'unknown))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4838 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4839
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4840 Any slot options other than @code{:read-only} are ignored.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4842 For obscure historical reasons, structure options take a different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4843 form than slot options. A structure option is either a keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4844 symbol, or a list beginning with a keyword symbol possibly followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4845 by arguments. (By contrast, slot options are key-value pairs not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4846 enclosed in lists.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4847
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4848 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4849 (defstruct (person (:constructor create-person)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4850 (:type list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4851 :named)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4852 name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4853 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4855 The following structure options are recognized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4857 @table @code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4858 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4859 @itemmax=0 in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4860 @advance@leftskip-.5@tableindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4861 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4862 @item :conc-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4863 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
4864 the names of slot accessor functions. The default is the name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4865 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
4866 would change this prefix to @code{p-}. Specifying @code{nil} as an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4867 argument means no prefix, so that the slot names themselves are used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4868 to name the accessor functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4869
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4870 @item :constructor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4871 In the simple case, this option takes one argument which is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4872 alternate name to use for the constructor function. The default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4873 is @code{make-@var{name}}, e.g., @code{make-person}. The above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4874 example changes this to @code{create-person}. Specifying @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4875 as an argument means that no standard constructor should be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4876 generated at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4877
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4878 In the full form of this option, the constructor name is followed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4879 by an arbitrary argument list. @xref{Program Structure}, for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4880 description of the format of Common Lisp argument lists. All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4881 options, such as @code{&rest} and @code{&key}, are supported.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4882 The argument names should match the slot names; each slot is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4883 initialized from the corresponding argument. Slots whose names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4884 do not appear in the argument list are initialized based on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4885 @var{default-value} in their slot descriptor. Also, @code{&optional}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4886 and @code{&key} arguments which don't specify defaults take their
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4887 defaults from the slot descriptor. It is legal to include arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4888 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
4889 referred to in the defaults for optional, keyword, or @code{&aux}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4890 arguments which @emph{do} correspond to slots.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4892 You can specify any number of full-format @code{:constructor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4893 options on a structure. The default constructor is still generated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4894 as well unless you disable it with a simple-format @code{:constructor}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4895 option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4896
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4897 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4898 (defstruct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4899 (person
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4900 (:constructor nil) ; no default constructor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4901 (:constructor new-person (name sex &optional (age 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4902 (:constructor new-hound (&key (name "Rover")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4903 (dog-years 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4904 &aux (age (* 7 dog-years))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4905 (sex 'canine))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4906 name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4907 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4909 The first constructor here takes its arguments positionally rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4910 than by keyword. (In official Common Lisp terminology, constructors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4911 that work By Order of Arguments instead of by keyword are called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4912 ``BOA constructors.'' No, I'm not making this up.) For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4913 @code{(new-person "Jane" 'female)} generates a person whose slots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4914 are @code{"Jane"}, 0, and @code{female}, respectively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4915
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4916 The second constructor takes two keyword arguments, @code{:name},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4917 which initializes the @code{name} slot and defaults to @code{"Rover"},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4918 and @code{:dog-years}, which does not itself correspond to a slot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4919 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
4920 slot is forced to the symbol @code{canine} with no syntax for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4921 overriding it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4923 @item :copier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4924 The argument is an alternate name for the copier function for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4925 this type. The default is @code{copy-@var{name}}. @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4926 means not to generate a copier function. (In this implementation,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4927 all copier functions are simply synonyms for @code{copy-sequence}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4928
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4929 @item :predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4930 The argument is an alternate name for the predicate which recognizes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4931 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
4932 means not to generate a predicate function. (If the @code{:type}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4933 option is used without the @code{:named} option, no predicate is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4934 ever generated.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4936 In true Common Lisp, @code{typep} is always able to recognize a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4937 structure object even if @code{:predicate} was used. In this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4938 package, @code{typep} simply looks for a function called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4939 @code{@var{typename}-p}, so it will work for structure types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4940 only if they used the default predicate name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4942 @item :include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4943 This option implements a very limited form of C++-style inheritance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4944 The argument is the name of another structure type previously
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4945 created with @code{defstruct}. The effect is to cause the new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4946 structure type to inherit all of the included structure's slots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4947 (plus, of course, any new slots described by this struct's slot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4948 descriptors). The new structure is considered a ``specialization''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4949 of the included one. In fact, the predicate and slot accessors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4950 for the included type will also accept objects of the new type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4952 If there are extra arguments to the @code{:include} option after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4953 the included-structure name, these options are treated as replacement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4954 slot descriptors for slots in the included structure, possibly with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4955 modified default values. Borrowing an example from Steele:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4957 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4958 (defstruct person name (age 0) sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4959 @result{} person
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4960 (defstruct (astronaut (:include person (age 45)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4961 helmet-size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4962 (favorite-beverage 'tang))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4963 @result{} astronaut
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4964
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4965 (setq joe (make-person :name "Joe"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4966 @result{} [cl-struct-person "Joe" 0 nil]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4967 (setq buzz (make-astronaut :name "Buzz"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4968 @result{} [cl-struct-astronaut "Buzz" 45 nil nil tang]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4969
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4970 (list (person-p joe) (person-p buzz))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4971 @result{} (t t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4972 (list (astronaut-p joe) (astronaut-p buzz))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4973 @result{} (nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4975 (person-name buzz)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4976 @result{} "Buzz"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4977 (astronaut-name joe)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4978 @result{} error: "astronaut-name accessing a non-astronaut"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4979 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4981 Thus, if @code{astronaut} is a specialization of @code{person},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4982 then every @code{astronaut} is also a @code{person} (but not the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4983 other way around). Every @code{astronaut} includes all the slots
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4984 of a @code{person}, plus extra slots that are specific to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4985 astronauts. Operations that work on people (like @code{person-name})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4986 work on astronauts just like other people.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4988 @item :print-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4989 In full Common Lisp, this option allows you to specify a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4990 which is called to print an instance of the structure type. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4991 Emacs Lisp system offers no hooks into the Lisp printer which would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4992 allow for such a feature, so this package simply ignores
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4993 @code{:print-function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4994
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4995 @item :type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4996 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
4997 This tells which underlying Lisp data type should be used to implement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4998 the new structure type. Vectors are used by default, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4999 @code{(:type list)} will cause structure objects to be stored as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5000 lists instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5001
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5002 The vector representation for structure objects has the advantage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5003 that all structure slots can be accessed quickly, although creating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5004 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
5005 but take a relatively long time accessing the later slots.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5007 @item :named
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5008 This option, which takes no arguments, causes a characteristic ``tag''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5009 symbol to be stored at the front of the structure object. Using
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5010 @code{:type} without also using @code{:named} will result in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5011 structure type stored as plain vectors or lists with no identifying
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5012 features.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5014 The default, if you don't specify @code{:type} explicitly, is to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5015 use named vectors. Therefore, @code{:named} is only useful in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5016 conjunction with @code{:type}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5018 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5019 (defstruct (person1) name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5020 (defstruct (person2 (:type list) :named) name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5021 (defstruct (person3 (:type list)) name age sex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5022
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5023 (setq p1 (make-person1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5024 @result{} [cl-struct-person1 nil nil nil]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5025 (setq p2 (make-person2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5026 @result{} (person2 nil nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5027 (setq p3 (make-person3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5028 @result{} (nil nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5029
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5030 (person1-p p1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5031 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5032 (person2-p p2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5033 @result{} t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5034 (person3-p p3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5035 @result{} error: function person3-p undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5036 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5037
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5038 Since unnamed structures don't have tags, @code{defstruct} is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5039 able to make a useful predicate for recognizing them. Also,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5040 accessors like @code{person3-name} will be generated but they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5041 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
5042 function, for example, will simply be a synonym for @code{car} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5043 this case. By contrast, @code{person2-name} is able to verify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5044 that its argument is indeed a @code{person2} object before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5045 proceeding.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5047 @item :initial-offset
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5048 The argument must be a nonnegative integer. It specifies a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5049 number of slots to be left ``empty'' at the front of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5050 structure. If the structure is named, the tag appears at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5051 specified position in the list or vector; otherwise, the first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5052 slot appears at that position. Earlier positions are filled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5053 with @code{nil} by the constructors and ignored otherwise. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5054 the type @code{:include}s another type, then @code{:initial-offset}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5055 specifies a number of slots to be skipped between the last slot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5056 of the included type and the first new slot.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5057 @end table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5058 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5059
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5060 Except as noted, the @code{defstruct} facility of this package is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5061 entirely compatible with that of Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5062
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5063 @iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5064 @chapno=23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5065 @end iftex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5066
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5067 @node Assertions, Efficiency Concerns, Structures, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5068 @chapter Assertions and Errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5070 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5071 This section describes two macros that test @dfn{assertions}, i.e.,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5072 conditions which must be true if the program is operating correctly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5073 Assertions never add to the behavior of a Lisp program; they simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5074 make ``sanity checks'' to make sure everything is as it should be.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5076 If the optimization property @code{speed} has been set to 3, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5077 @code{safety} is less than 3, then the byte-compiler will optimize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5078 away the following assertions. Because assertions might be optimized
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5079 away, it is a bad idea for them to include side-effects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5080
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5081 @defspec assert test-form [show-args string args@dots{}]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5082 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
5083 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
5084 is not satisfied, @code{assert} signals an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5085
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5086 A default error message will be supplied which includes @var{test-form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5087 You can specify a different error message by including a @var{string}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5088 argument plus optional extra arguments. Those arguments are simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5089 passed to @code{error} to signal the error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5091 If the optional second argument @var{show-args} is @code{t} instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5092 of @code{nil}, then the error message (with or without @var{string})
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5093 will also include all non-constant arguments of the top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5094 @var{form}. For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5095
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5096 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5097 (assert (> x 10) t "x is too small: %d")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5098 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5099
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5100 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
5101 true Common Lisp, the second argument gives a list of @var{places}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5102 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
5103 error.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5104 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5105
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5106 @defspec check-type place type &optional string
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5107 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
5108 @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
5109 signals a continuable @code{wrong-type-argument} error. The default
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5110 error message lists the erroneous value along with @var{type} and
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5111 @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
5112 the error message in place of @var{type}. For example:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5114 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5115 (check-type x (integer 1 *) "a positive integer")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5116 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5118 @xref{Type Predicates}, for a description of the type specifiers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5119 that may be used for @var{type}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5120
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
5121 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
5122 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
5123 @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
5124 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
5125 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5127 The following error-related macro is also defined:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5129 @defspec ignore-errors forms@dots{}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5130 This executes @var{forms} exactly like a @code{progn}, except that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5131 errors are ignored during the @var{forms}. More precisely, if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5132 an error is signalled then @code{ignore-errors} immediately
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5133 aborts execution of the @var{forms} and returns @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5134 If the @var{forms} complete successfully, @code{ignore-errors}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5135 returns the result of the last @var{form}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5136 @end defspec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5138 @node Efficiency Concerns, Common Lisp Compatibility, Assertions, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5139 @appendix Efficiency Concerns
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5141 @appendixsec Macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5143 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5144 Many of the advanced features of this package, such as @code{defun*},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5145 @code{loop}, and @code{setf}, are implemented as Lisp macros. In
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5146 byte-compiled code, these complex notations will be expanded into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5147 equivalent Lisp code which is simple and efficient. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5148 the forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5150 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5151 (incf i n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5152 (push x (car p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5153 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5155 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5156 are expanded at compile-time to the Lisp forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5158 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5159 (setq i (+ i n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5160 (setcar p (cons x (car p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5161 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5163 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5164 which are the most efficient ways of doing these respective operations
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5165 in Lisp. Thus, there is no performance penalty for using the more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5166 readable @code{incf} and @code{push} forms in your compiled code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5168 @emph{Interpreted} code, on the other hand, must expand these macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5169 every time they are executed. For this reason it is strongly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5170 recommended that code making heavy use of macros be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5171 (The features labelled ``Special Form'' instead of ``Function'' in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5172 this manual are macros.) A loop using @code{incf} a hundred times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5173 will execute considerably faster if compiled, and will also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5174 garbage-collect less because the macro expansion will not have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5175 to be generated, used, and thrown away a hundred times.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5177 You can find out how a macro expands by using the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5178 @code{cl-prettyexpand} function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5180 @defun cl-prettyexpand form &optional full
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5181 This function takes a single Lisp form as an argument and inserts
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5182 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
5183 in Lisp mode so that indentation works properly). It also expands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5184 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
5185 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
5186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5187 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5188 (cl-prettyexpand '(loop for x below 10 collect x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5189 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5191 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5192 and type @kbd{C-x C-e} immediately after the closing parenthesis;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5193 the expansion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5195 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5196 (block nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5197 (let* ((x 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5198 (G1004 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5199 (while (< x 10)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5200 (setq G1004 (cons x G1004))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5201 (setq x (+ x 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5202 (nreverse G1004)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5203 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5205 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5206 will be inserted into the buffer. (The @code{block} macro is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5207 expanded differently in the interpreter and compiler, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5208 @code{cl-prettyexpand} just leaves it alone. The temporary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5209 variable @code{G1004} was created by @code{gensym}.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5211 If the optional argument @var{full} is true, then @emph{all}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5212 macros are expanded, including @code{block}, @code{eval-when},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5213 and compiler macros. Expansion is done as if @var{form} were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5214 a top-level form in a file being compiled. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5216 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5217 (cl-prettyexpand '(pushnew 'x list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5218 @print{} (setq list (adjoin 'x list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5219 (cl-prettyexpand '(pushnew 'x list) t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5220 @print{} (setq list (if (memq 'x list) list (cons 'x list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5221 (cl-prettyexpand '(caddr (member* 'a list)) t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5222 @print{} (car (cdr (cdr (memq 'a list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5223 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5225 Note that @code{adjoin}, @code{caddr}, and @code{member*} all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5226 have built-in compiler macros to optimize them in common cases.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5227 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5229 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5230 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5232 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5233 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5234 @appendixsec Error Checking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5236 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5237 Common Lisp compliance has in general not been sacrificed for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5238 sake of efficiency. A few exceptions have been made for cases
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5239 where substantial gains were possible at the expense of marginal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5240 incompatibility. One example is the use of @code{memq} (which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5241 treated very efficiently by the byte-compiler) to scan for keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5242 arguments; this can become confused in rare cases when keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5243 symbols are used as both keywords and data values at once. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5244 is extremely unlikely to occur in practical code, and the use of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5245 @code{memq} allows functions with keyword arguments to be nearly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5246 as fast as functions that use @code{&optional} arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5248 The Common Lisp standard (as embodied in Steele's book) uses the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5249 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
5250 supposed to arise in complying programs; implementations are strongly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5251 encouraged but not required to signal an error in these situations.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5252 This package sometimes omits such error checking in the interest of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5253 compactness and efficiency. For example, @code{do} variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5254 specifiers are supposed to be lists of one, two, or three forms;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5255 extra forms are ignored by this package rather than signalling a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5256 syntax error. The @code{endp} function is simply a synonym for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5257 @code{null} in this package. Functions taking keyword arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5258 will accept an odd number of arguments, treating the trailing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5259 keyword as if it were followed by the value @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5261 Argument lists (as processed by @code{defun*} and friends)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5262 @emph{are} checked rigorously except for the minor point just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5263 mentioned; in particular, keyword arguments are checked for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5264 validity, and @code{&allow-other-keys} and @code{:allow-other-keys}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5265 are fully implemented. Keyword validity checking is slightly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5266 time consuming (though not too bad in byte-compiled code);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5267 you can use @code{&allow-other-keys} to omit this check. Functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5268 defined in this package such as @code{find} and @code{member*}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5269 do check their keyword arguments for validity.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5271 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5272 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5274 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5275 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5276 @appendixsec Optimizing Compiler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5278 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5279 The byte-compiler that comes with Emacs 18 normally fails to expand
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5280 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
5281 of @code{defun}s or other enclosing forms). This would have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5282 disastrous consequences to programs that used such top-level macros
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5283 as @code{defun*}, @code{eval-when}, and @code{defstruct}. To
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5284 work around this problem, the @dfn{CL} package patches the Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5285 18 compiler to expand top-level macros. This patch will apply to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5286 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
5287 The patch will not harm versions of the Emacs 18 compiler which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5288 have already had a similar patch applied, nor will it affect the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5289 optimizing Emacs 19 byte-compiler written by Jamie Zawinski and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5290 Hallvard Furuseth. The patch is applied to the byte compiler's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5291 code in Emacs' memory, @emph{not} to the @file{bytecomp.elc} file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5292 stored on disk.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5294 The Emacs 19 compiler (for Emacs 18) is available from various
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5295 Emacs Lisp archive sites such as @code{archive.cis.ohio-state.edu}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5296 Its use is highly recommended; many of the Common Lisp macros emit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5297 code which can be improved by optimization. In particular,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5298 @code{block}s (whether explicit or implicit in constructs like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5299 @code{defun*} and @code{loop}) carry a fair run-time penalty; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5300 optimizing compiler removes @code{block}s which are not actually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5301 referenced by @code{return} or @code{return-from} inside the block.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5303 @node Common Lisp Compatibility, Old CL Compatibility, Efficiency Concerns, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5304 @appendix Common Lisp Compatibility
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5306 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5307 Following is a list of all known incompatibilities between this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5308 package and Common Lisp as documented in Steele (2nd edition).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5310 Certain function names, such as @code{member}, @code{assoc}, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5311 @code{floor}, were already taken by (incompatible) Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5312 functions; this package appends @samp{*} to the names of its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5313 Common Lisp versions of these functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5315 The word @code{defun*} is required instead of @code{defun} in order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5316 to use extended Common Lisp argument lists in a function. Likewise,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5317 @code{defmacro*} and @code{function*} are versions of those forms
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5318 which understand full-featured argument lists. The @code{&whole}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5319 keyword does not work in @code{defmacro} argument lists (except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5320 inside recursive argument lists).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5322 In order to allow an efficient implementation, keyword arguments use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5323 a slightly cheesy parser which may be confused if a keyword symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5324 is passed as the @emph{value} of another keyword argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5325 (Specifically, @code{(memq :@var{keyword} @var{rest-of-arguments})}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5326 is used to scan for @code{:@var{keyword}} among the supplied
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5327 keyword arguments.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5329 The @code{eql} and @code{equal} predicates do not distinguish
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5330 between IEEE floating-point plus and minus zero. The @code{equalp}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5331 predicate has several differences with Common Lisp; @pxref{Predicates}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5333 The @code{setf} mechanism is entirely compatible, except that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5334 setf-methods return a list of five values rather than five
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5335 values directly. Also, the new ``@code{setf} function'' concept
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5336 (typified by @code{(defun (setf foo) @dots{})}) is not implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5338 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
5339 with no @var{obarray} argument. In Common Lisp, this form would
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5340 iterate over all symbols in all packages. Since Emacs obarrays
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5341 are not a first-class package mechanism, there is no way for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5342 @code{do-all-symbols} to locate any but the default obarray.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5344 The @code{loop} macro is complete except that @code{loop-finish}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5345 and type specifiers are unimplemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5347 Many Common Lisp declarations are ignored, and others match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5348 the Common Lisp standard in concept but not in detail. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5349 example, local @code{special} declarations, which are purely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5350 advisory in Emacs Lisp, do not rigorously obey the scoping rules
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5351 set down in Steele's book.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5353 The variable @code{*gensym-counter*} starts out with a pseudo-random
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5354 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
5355 generated symbols become interned when they are written to and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5356 loaded back from a file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5358 The @code{defstruct} facility is compatible, except that structures
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5359 are of type @code{:type vector :named} by default rather than some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5360 special, distinct type. Also, the @code{:type} slot option is ignored.
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 second argument of @code{check-type} is treated differently.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5364 @node Old CL Compatibility, Porting Common Lisp, Common Lisp Compatibility, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5365 @appendix Old CL Compatibility
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 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5368 Following is a list of all known incompatibilities between this package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5369 and the older Quiroz @file{cl.el} package.
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 @code{defkeyword} form and @code{keywordp} function are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5372 implemented in this package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5374 The @code{member}, @code{floor}, @code{ceiling}, @code{truncate},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5375 @code{round}, @code{mod}, and @code{rem} functions are suffixed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5376 by @samp{*} in this package to avoid collision with existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5377 functions in Emacs 18 or Emacs 19. The older package simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5378 redefined these functions, overwriting the built-in meanings and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5379 causing serious portability problems with Emacs 19. (Some more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5380 recent versions of the Quiroz package changed the names to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5381 @code{cl-member}, etc.; this package defines the latter names as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5382 aliases for @code{member*}, etc.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5384 Certain functions in the old package which were buggy or inconsistent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5385 with the Common Lisp standard are incompatible with the conforming
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5386 versions in this package. For example, @code{eql} and @code{member}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5387 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
5388 failed to preserve correct order of evaluation of its arguments, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5390 Finally, unlike the older package, this package is careful to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5391 prefix all of its internal names with @code{cl-}. Except for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5392 few functions which are explicitly defined as additional features
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5393 (such as @code{floatp-safe} and @code{letf}), this package does not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5394 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
5395 Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5397 @ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5398 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5400 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5401 @end ifinfo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5402 @appendixsec The @code{cl-compat} package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5404 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5405 The @dfn{CL} package includes emulations of some features of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5406 old @file{cl.el}, in the form of a compatibility package
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5407 @code{cl-compat}. To use it, put @code{(require 'cl-compat)} in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5408 your program.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5410 The old package defined a number of internal routines without
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5411 @code{cl-} prefixes or other annotations. Call to these routines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5412 may have crept into existing Lisp code. @code{cl-compat}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5413 provides emulations of the following internal routines:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5414 @code{pair-with-newsyms}, @code{zip-lists}, @code{unzip-lists},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5415 @code{reassemble-arglists}, @code{duplicate-symbols-p},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5416 @code{safe-idiv}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5418 Some @code{setf} forms translated into calls to internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5419 functions that user code might call directly. The functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5420 @code{setnth}, @code{setnthcdr}, and @code{setelt} fall in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5421 this category; they are defined by @code{cl-compat}, but the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5422 best fix is to change to use @code{setf} properly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5424 The @code{cl-compat} file defines the keyword functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5425 @code{keywordp}, @code{keyword-of}, and @code{defkeyword},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5426 which are not defined by the new @dfn{CL} package because the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5427 use of keywords as data is discouraged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5429 The @code{build-klist} mechanism for parsing keyword arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5430 is emulated by @code{cl-compat}; the @code{with-keyword-args}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5431 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
5432 use the more natural keyword argument processing offered by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5433 @code{defun*}.
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 The functions @code{cl-floor}, @code{cl-ceiling}, @code{cl-truncate},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5436 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
5437 old-style multiple-value mechanism, just as they did in the old
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5438 package. The newer @code{floor*} and friends return their two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5439 results in a list rather than as multiple values. Note that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5440 older versions of the old package used the unadorned names
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5441 @code{floor}, @code{ceiling}, etc.; @code{cl-compat} cannot use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5442 these names because they conflict with Emacs 19 built-ins.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5444 @node Porting Common Lisp, Function Index, Old CL Compatibility, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5445 @appendix Porting Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5446
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5447 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5448 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
5449 not as an Emacs implementation of true Common Lisp. Some of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5450 remaining differences between Emacs Lisp and Common Lisp make it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5451 difficult to port large Common Lisp applications to Emacs. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5452 one, some of the features in this package are not fully compliant
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5453 with ANSI or Steele; @pxref{Common Lisp Compatibility}. But there
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5454 are also quite a few features that this package does not provide
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5455 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
5456 for when bringing Common Lisp code into Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5458 @itemize @bullet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5459 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5460 Case-insensitivity. Symbols in Common Lisp are case-insensitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5461 by default. Some programs refer to a function or variable as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5462 @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
5463 Emacs Lisp will treat these as three distinct symbols.
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 Some Common Lisp code is written in all upper-case. While Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5466 is happy to let the program's own functions and variables use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5467 this convention, calls to Lisp builtins like @code{if} and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5468 @code{defun} will have to be changed to lower-case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5470 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5471 Lexical scoping. In Common Lisp, function arguments and @code{let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5472 bindings apply only to references physically within their bodies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5473 (or within macro expansions in their bodies). Emacs Lisp, by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5474 contrast, uses @dfn{dynamic scoping} wherein a binding to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5475 variable is visible even inside functions called from the body.
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 Variables in Common Lisp can be made dynamically scoped by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5478 declaring them @code{special} or using @code{defvar}. In Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5479 Lisp it is as if all variables were declared @code{special}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5481 Often you can use code that was written for lexical scoping
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5482 even in a dynamically scoped Lisp, but not always. Here is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5483 an example of a Common Lisp code fragment that would fail in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5484 Emacs Lisp:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5486 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5487 (defun map-odd-elements (func list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5488 (loop for x in list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5489 for flag = t then (not flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5490 collect (if flag x (funcall func x))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5492 (defun add-odd-elements (list x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5493 (map-odd-elements (function (lambda (a) (+ a x))) list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5494 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5496 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5497 In Common Lisp, the two functions' usages of @code{x} are completely
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5498 independent. In Emacs Lisp, the binding to @code{x} made by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5499 @code{add-odd-elements} will have been hidden by the binding
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5500 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
5501 is called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5503 (This package avoids such problems in its own mapping functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5504 by using names like @code{cl-x} instead of @code{x} internally;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5505 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
5506 variables no collision can occur.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5508 @xref{Lexical Bindings}, for a description of the @code{lexical-let}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5509 form which establishes a Common Lisp-style lexical binding, and some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5510 examples of how it differs from Emacs' regular @code{let}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5512 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5513 Common Lisp allows the shorthand @code{#'x} to stand for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5514 @code{(function x)}, just as @code{'x} stands for @code{(quote x)}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5515 In Common Lisp, one traditionally uses @code{#'} notation when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5516 referring to the name of a function. In Emacs Lisp, it works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5517 just as well to use a regular quote:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5519 @example
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
5520 (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
5521 (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
5522 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5524 When @code{#'} introduces a @code{lambda} form, it is best to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5525 write out @code{(function ...)} longhand in Emacs Lisp. You can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5526 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
5527 the @code{lambda} expression is code that can be compiled.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5529 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5530 (mapcar #'(lambda (x) (* x 2)) list) ; Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5531 (mapcar (function (lambda (x) (* x 2))) list) ; Emacs Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5532 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5533
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5534 XEmacs supports @code{#'} notation starting with version 19.8.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5536 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5537 Reader macros. Common Lisp includes a second type of macro that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5538 works at the level of individual characters. For example, Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5539 Lisp implements the quote notation by a reader macro called @code{'},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5540 whereas Emacs Lisp's parser just treats quote as a special case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5541 Some Lisp packages use reader macros to create special syntaxes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5542 for themselves, which the Emacs parser is incapable of reading.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5544 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5545 Other syntactic features. Common Lisp provides a number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5546 notations beginning with @code{#} that the Emacs Lisp parser
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5547 won't understand. For example, @samp{#| ... |#} is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5548 alternate comment notation, and @samp{#+lucid (foo)} tells
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5549 the parser to ignore the @code{(foo)} except in Lucid Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5550 Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5552 The number prefixes `#b', `#o', and `#x', however, are supported
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5553 by the Emacs Lisp parser to represent numbers in binary, octal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5554 and hexadecimal notation (or radix), just like in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5556 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5557 Packages. In Common Lisp, symbols are divided into @dfn{packages}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5558 Symbols that are Lisp built-ins are typically stored in one package;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5559 symbols that are vendor extensions are put in another, and each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5560 application program would have a package for its own symbols.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5561 Certain symbols are ``exported'' by a package and others are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5562 internal; certain packages ``use'' or import the exported symbols
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5563 of other packages. To access symbols that would not normally be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5564 visible due to this importing and exporting, Common Lisp provides
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5565 a syntax like @code{package:symbol} or @code{package::symbol}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5567 Emacs Lisp has a single namespace for all interned symbols, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5568 then uses a naming convention of putting a prefix like @code{cl-}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5569 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
5570 convention of using @code{cl:} or @code{cl::} as the prefix.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5571 However, the Emacs parser does not understand colons and just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5572 treats them as part of the symbol name. Thus, while @code{mapcar}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5573 and @code{lisp:mapcar} may refer to the same symbol in Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5574 Lisp, they are totally distinct in Emacs Lisp. Common Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5575 programs which refer to a symbol by the full name sometimes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5576 and the short name other times will not port cleanly to Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5578 Emacs Lisp does have a concept of ``obarrays,'' which are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5579 package-like collections of symbols, but this feature is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5580 strong enough to be used as a true package mechanism.
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 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5583 Keywords. The notation @code{:test-not} in Common Lisp really
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5584 is a shorthand for @code{keyword:test-not}; keywords are just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5585 symbols in a built-in @code{keyword} package with the special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5586 property that all its symbols are automatically self-evaluating.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5587 Common Lisp programs often use keywords liberally to avoid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5588 having to use quotes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5590 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
5591 a colon; since the Emacs parser does not treat them specially,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5592 they have to be explicitly made self-evaluating by a statement
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5593 like @code{(setq :test-not ':test-not)}. This package arranges
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5594 to execute such a statement whenever @code{defun*} or some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5595 other form sees a keyword being used as an argument. Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5596 Lisp code that assumes that a symbol @code{:mumble} will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5597 self-evaluating even though it was never introduced by a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5598 @code{defun*} will have to be fixed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5599
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5600 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5601 The @code{format} function is quite different between Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5602 Lisp and Emacs Lisp. It takes an additional ``destination''
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5603 argument before the format string. A destination of @code{nil}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5604 means to format to a string as in Emacs Lisp; a destination
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5605 of @code{t} means to write to the terminal (similar to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5606 @code{message} in Emacs). Also, format control strings are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5607 utterly different; @code{~} is used instead of @code{%} to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5608 introduce format codes, and the set of available codes is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5609 much richer. There are no notations like @code{\n} for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5610 string literals; instead, @code{format} is used with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5611 ``newline'' format code, @code{~%}. More advanced formatting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5612 codes provide such features as paragraph filling, case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5613 conversion, and even loops and conditionals.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5615 While it would have been possible to implement most of Common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5616 Lisp @code{format} in this package (under the name @code{format*},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5617 of course), it was not deemed worthwhile. It would have required
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5618 a huge amount of code to implement even a decent subset of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5619 @code{format*}, yet the functionality it would provide over
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5620 Emacs Lisp's @code{format} would rarely be useful.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5621
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5622 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5623 Vector constants use square brackets in Emacs Lisp, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5624 @code{#(a b c)} notation in Common Lisp. To further complicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5625 matters, Emacs 19 introduces its own @code{#(} notation for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5626 something entirely different---strings with properties.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5627
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5628 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5629 Characters are distinct from integers in Common Lisp. The
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5630 notation for character constants is also different: @code{#\A}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5631 instead of @code{?A}. Also, @code{string=} and @code{string-equal}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5632 are synonyms in Emacs Lisp whereas the latter is case-insensitive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5633 in Common Lisp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5634
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5635 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5636 Data types. Some Common Lisp data types do not exist in Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5637 Lisp. Rational numbers and complex numbers are not present,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5638 nor are large integers (all integers are ``fixnums''). All
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5639 arrays are one-dimensional. There are no readtables or pathnames;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5640 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
5641 type of their own. Hash tables, random-states, structures, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5642 packages (obarrays) are built from Lisp vectors or lists rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5643 than being distinct types.
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 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5646 The Common Lisp Object System (CLOS) is not implemented,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5647 nor is the Common Lisp Condition System.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5649 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5650 Common Lisp features that are completely redundant with Emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5651 Lisp features of a different name generally have not been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5652 implemented. For example, Common Lisp writes @code{defconstant}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5653 where Emacs Lisp uses @code{defconst}. Similarly, @code{make-list}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5654 takes its arguments in different ways in the two Lisps but does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5655 exactly the same thing, so this package has not bothered to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5656 implement a Common Lisp-style @code{make-list}.
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 A few more notable Common Lisp features not included in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5660 package: @code{compiler-let}, @code{tagbody}, @code{prog},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5661 @code{ldb/dpb}, @code{parse-integer}, @code{cerror}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5663 @item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5664 Recursion. While recursion works in Emacs Lisp just like it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5665 does in Common Lisp, various details of the Emacs Lisp system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5666 and compiler make recursion much less efficient than it is in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5667 most Lisps. Some schools of thought prefer to use recursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5668 in Lisp over other techniques; they would sum a list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5669 numbers using something like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5671 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5672 (defun sum-list (list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5673 (if list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5674 (+ (car list) (sum-list (cdr list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5675 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5676 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5677
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5678 @noindent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5679 where a more iteratively-minded programmer might write one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5680 these forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5682 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5683 (let ((total 0)) (dolist (x my-list) (incf total x)) total)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5684 (loop for x in my-list sum x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5685 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5687 While this would be mainly a stylistic choice in most Common Lisps,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5688 in Emacs Lisp you should be aware that the iterative forms are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5689 much faster than recursion. Also, Lisp programmers will want to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5690 note that the current Emacs Lisp compiler does not optimize tail
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5691 recursion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5692 @end itemize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5694 @node Function Index, Variable Index, Porting Common Lisp, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5695 @unnumbered Function Index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5697 @printindex fn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5699 @node Variable Index, , Function Index, Top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5700 @unnumbered Variable Index
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5702 @printindex vr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5704 @contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5705 @bye