annotate lispref/symbols.texi @ 76022:e892213b9815

(w32_set_scroll_bar_thumb): Don't resize scroll-bar handle while dragging, except when we get close to eob. Fix position and size calculations so we don't scroll backwards just by clicking on the handle.
author Kim F. Storm <storm@cua.dk>
date Mon, 19 Feb 2007 14:45:39 +0000
parents 6d19c76d81c5
children fc9d442f98d2 95d0cdf160ea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 @c -*-texinfo-*-
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2 @c This is part of the GNU Emacs Lisp Reference Manual.
75250
6d19c76d81c5 Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 71957
diff changeset
3 @c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2001,
6d19c76d81c5 Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 71957
diff changeset
4 @c 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 @c See the file elisp.texi for copying conditions.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 @setfilename ../info/symbols
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
7 @node Symbols, Evaluation, Hash Tables, Top
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 @chapter Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 @cindex symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 A @dfn{symbol} is an object with a unique name. This chapter
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 describes symbols, their components, their property lists, and how they
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 are created and interned. Separate chapters describe the use of symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 as variables and as function names; see @ref{Variables}, and
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 @ref{Functions}. For the precise read syntax for symbols, see
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 @ref{Symbol Type}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 You can test whether an arbitrary Lisp object is a symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 with @code{symbolp}:
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 @defun symbolp object
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 This function returns @code{t} if @var{object} is a symbol, @code{nil}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 otherwise.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 @menu
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 * Symbol Components:: Symbols have names, values, function definitions
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 and property lists.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 * Definitions:: A definition says how a symbol will be used.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 * Creating Symbols:: How symbols are kept unique.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 * Property Lists:: Each symbol has a property list
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 for recording miscellaneous information.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
33 @end menu
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35 @node Symbol Components, Definitions, Symbols, Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 @section Symbol Components
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 @cindex symbol components
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 Each symbol has four components (or ``cells''), each of which
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 references another object:
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 @table @asis
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 @item Print name
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 @cindex print name cell
7118
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
45 The @dfn{print name cell} holds a string that names the symbol for
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 reading and printing. See @code{symbol-name} in @ref{Creating Symbols}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 @item Value
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 @cindex value cell
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 The @dfn{value cell} holds the current value of the symbol as a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 variable. When a symbol is used as a form, the value of the form is the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 contents of the symbol's value cell. See @code{symbol-value} in
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 @ref{Accessing Variables}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 @item Function
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 @cindex function cell
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 The @dfn{function cell} holds the function definition of the symbol.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 When a symbol is used as a function, its function definition is used in
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 its place. This cell is also used to make a symbol stand for a keymap
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 or a keyboard macro, for editor command execution. Because each symbol
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
61 has separate value and function cells, variables names and function names do
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 not conflict. See @code{symbol-function} in @ref{Function Cells}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 @item Property list
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 @cindex property list cell
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 The @dfn{property list cell} holds the property list of the symbol. See
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 @code{symbol-plist} in @ref{Property Lists}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 @end table
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 The print name cell always holds a string, and cannot be changed. The
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71 other three cells can be set individually to any specified Lisp object.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 The print name cell holds the string that is the name of the symbol.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 Since symbols are represented textually by their names, it is important
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 not to have two symbols with the same name. The Lisp reader ensures
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 this: every time it reads a symbol, it looks for an existing symbol with
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 the specified name before it creates a new one. (In GNU Emacs Lisp,
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 this lookup uses a hashing algorithm and an obarray; see @ref{Creating
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79 Symbols}.)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80
27093
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
81 The value cell holds the symbol's value as a variable
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
82 (@pxref{Variables}). That is what you get if you evaluate the symbol as
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
83 a Lisp expression (@pxref{Evaluation}). Any Lisp object is a legitimate
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
84 value. Certain symbols have values that cannot be changed; these
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
85 include @code{nil} and @code{t}, and any symbol whose name starts with
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
86 @samp{:} (those are called @dfn{keywords}). @xref{Constant Variables}.
4b1a67a46d8c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 25751
diff changeset
87
38944
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
88 We often refer to ``the function @code{foo}'' when we really mean
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
89 the function stored in the function cell of the symbol @code{foo}. We
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
90 make the distinction explicit only when necessary. In normal
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
91 usage, the function cell usually contains a function
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
92 (@pxref{Functions}) or a macro (@pxref{Macros}), as that is what the
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
93 Lisp interpreter expects to see there (@pxref{Evaluation}). Keyboard
38944
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
94 macros (@pxref{Keyboard Macros}), keymaps (@pxref{Keymaps}) and
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
95 autoload objects (@pxref{Autoloading}) are also sometimes stored in
7a42abfb0c82 Minor clarification.
Richard M. Stallman <rms@gnu.org>
parents: 34014
diff changeset
96 the function cells of symbols.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
97
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
98 The property list cell normally should hold a correctly formatted
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
99 property list (@pxref{Property Lists}), as a number of functions expect
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
100 to see a property list there.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 The function cell or the value cell may be @dfn{void}, which means
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 that the cell does not reference any object. (This is not the same
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 thing as holding the symbol @code{void}, nor the same as holding the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
105 symbol @code{nil}.) Examining a function or value cell that is void
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
106 results in an error, such as @samp{Symbol's value as variable is void}.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
107
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
108 The four functions @code{symbol-name}, @code{symbol-value},
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 @code{symbol-plist}, and @code{symbol-function} return the contents of
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110 the four cells of a symbol. Here as an example we show the contents of
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
111 the four cells of the symbol @code{buffer-file-name}:
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 @example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 (symbol-name 'buffer-file-name)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 @result{} "buffer-file-name"
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 (symbol-value 'buffer-file-name)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 @result{} "/gnu/elisp/symbols.texi"
60047
16e24b1eba47 (Symbol Components): Reorder examples.
Richard M. Stallman <rms@gnu.org>
parents: 58236
diff changeset
118 (symbol-function 'buffer-file-name)
16e24b1eba47 (Symbol Components): Reorder examples.
Richard M. Stallman <rms@gnu.org>
parents: 58236
diff changeset
119 @result{} #<subr buffer-file-name>
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 (symbol-plist 'buffer-file-name)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 @result{} (variable-documentation 29529)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 @end example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 @noindent
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 Because this symbol is the variable which holds the name of the file
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 being visited in the current buffer, the value cell contents we see are
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 the name of the source file of this chapter of the Emacs Lisp Manual.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 The property list cell contains the list @code{(variable-documentation
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 29529)} which tells the documentation functions where to find the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 documentation string for the variable @code{buffer-file-name} in the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
131 @file{DOC-@var{version}} file. (29529 is the offset from the beginning
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
132 of the @file{DOC-@var{version}} file to where that documentation string
22138
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
133 begins---see @ref{Documentation Basics}.) The function cell contains
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
134 the function for returning the name of the file.
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
135 @code{buffer-file-name} names a primitive function, which has no read
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
136 syntax and prints in hash notation (@pxref{Primitive Function Type}). A
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
137 symbol naming a function written in Lisp would have a lambda expression
d4ac295a98b3 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21682
diff changeset
138 (or a byte-code object) in this cell.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 @node Definitions, Creating Symbols, Symbol Components, Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 @section Defining Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 @cindex definition of a symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 A @dfn{definition} in Lisp is a special form that announces your
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 intention to use a certain symbol in a particular way. In Emacs Lisp,
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 you can define a symbol as a variable, or define it as a function (or
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147 macro), or both independently.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 A definition construct typically specifies a value or meaning for the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 symbol for one kind of use, plus documentation for its meaning when used
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 in this way. Thus, when you define a symbol as a variable, you can
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 supply an initial value for the variable, plus documentation for the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 variable.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 @code{defvar} and @code{defconst} are special forms that define a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 symbol as a global variable. They are documented in detail in
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
157 @ref{Defining Variables}. For defining user option variables that can
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
158 be customized, use @code{defcustom} (@pxref{Customization}).
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 @code{defun} defines a symbol as a function, creating a lambda
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 expression and storing it in the function cell of the symbol. This
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 lambda expression thus becomes the function definition of the symbol.
71957
61cb5aae3bc3 Put period and comma inside quotes.
Richard M. Stallman <rms@gnu.org>
parents: 71695
diff changeset
163 (The term ``function definition,'' meaning the contents of the function
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 cell, is derived from the idea that @code{defun} gives the symbol its
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
165 definition as a function.) @code{defsubst} and @code{defalias} are two
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
166 other ways of defining a function. @xref{Functions}.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 @code{defmacro} defines a symbol as a macro. It creates a macro
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 object and stores it in the function cell of the symbol. Note that a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 given symbol can be a macro or a function, but not both at once, because
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 both macro and function definitions are kept in the function cell, and
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 that cell can hold only one Lisp object at any given time.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 @xref{Macros}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
175 In Emacs Lisp, a definition is not required in order to use a symbol
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
176 as a variable or function. Thus, you can make a symbol a global
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 variable with @code{setq}, whether you define it first or not. The real
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 purpose of definitions is to guide programmers and programming tools.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 They inform programmers who read the code that certain symbols are
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 @emph{intended} to be used as variables, or as functions. In addition,
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 utilities such as @file{etags} and @file{make-docfile} recognize
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 definitions, and add appropriate information to tag tables and the
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
183 @file{DOC-@var{version}} file. @xref{Accessing Documentation}.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 @node Creating Symbols, Property Lists, Definitions, Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 @section Creating and Interning Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 @cindex reading symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 To understand how symbols are created in GNU Emacs Lisp, you must know
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 how Lisp reads them. Lisp must ensure that it finds the same symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 every time it reads the same set of characters. Failure to do so would
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 cause complete confusion.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 @cindex symbol name hashing
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 @cindex hashing
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 @cindex obarray
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 @cindex bucket (in obarray)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 When the Lisp reader encounters a symbol, it reads all the characters
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 of the name. Then it ``hashes'' those characters to find an index in a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 table called an @dfn{obarray}. Hashing is an efficient method of
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 looking something up. For example, instead of searching a telephone
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 book cover to cover when looking up Jan Jones, you start with the J's
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 and go from there. That is a simple version of hashing. Each element
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 of the obarray is a @dfn{bucket} which holds all the symbols with a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 given hash code; to look for a given name, it is sufficient to look
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
206 through all the symbols in the bucket for that name's hash code. (The
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
207 same idea is used for general Emacs hash tables, but they are a
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
208 different data type; see @ref{Hash Tables}.)
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 @cindex interning
7118
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
211 If a symbol with the desired name is found, the reader uses that
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
212 symbol. If the obarray does not contain a symbol with that name, the
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
213 reader makes a new symbol and adds it to the obarray. Finding or adding
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
214 a symbol with a certain name is called @dfn{interning} it, and the
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
215 symbol is then called an @dfn{interned symbol}.
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
216
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
217 Interning ensures that each obarray has just one symbol with any
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
218 particular name. Other like-named symbols may exist, but not in the
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
219 same obarray. Thus, the reader gets the same symbols for the same
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
220 names, as long as you keep reading with the same obarray.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
222 Interning usually happens automatically in the reader, but sometimes
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
223 other programs need to do it. For example, after the @kbd{M-x} command
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
224 obtains the command name as a string using the minibuffer, it then
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
225 interns the string, to get the interned symbol with that name.
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
226
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 @cindex symbol equality
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 @cindex uninterned symbol
7118
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
229 No obarray contains all symbols; in fact, some symbols are not in any
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
230 obarray. They are called @dfn{uninterned symbols}. An uninterned
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
231 symbol has the same four cells as other symbols; however, the only way
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
232 to gain access to it is by finding it in some other object or as the
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
233 value of a variable.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
235 Creating an uninterned symbol is useful in generating Lisp code,
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
236 because an uninterned symbol used as a variable in the code you generate
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
237 cannot clash with any variables used in other Lisp programs.
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
238
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 In Emacs Lisp, an obarray is actually a vector. Each element of the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 vector is a bucket; its value is either an interned symbol whose name
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 hashes to that bucket, or 0 if the bucket is empty. Each interned
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 symbol has an internal link (invisible to the user) to the next symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 in the bucket. Because these links are invisible, there is no way to
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 find all the symbols in an obarray except using @code{mapatoms} (below).
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 The order of symbols in a bucket is not significant.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246
25751
467b88fab665 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 23727
diff changeset
247 In an empty obarray, every element is 0, so you can create an obarray
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 with @code{(make-vector @var{length} 0)}. @strong{This is the only
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 valid way to create an obarray.} Prime numbers as lengths tend
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 to result in good hashing; lengths one less than a power of two are also
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 good.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
253 @strong{Do not try to put symbols in an obarray yourself.} This does
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
254 not work---only @code{intern} can enter a symbol in an obarray properly.
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
255
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 @cindex CL note---symbol in obarrays
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 @quotation
7734
2d4db32cccd5 entered into RCS
Richard M. Stallman <rms@gnu.org>
parents: 7118
diff changeset
258 @b{Common Lisp note:} In Common Lisp, a single symbol may be interned in
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 several obarrays.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 @end quotation
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 Most of the functions below take a name and sometimes an obarray as
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 arguments. A @code{wrong-type-argument} error is signaled if the name
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 is not a string, or if the obarray is not a vector.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 @defun symbol-name symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 This function returns the string that is @var{symbol}'s name. For example:
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 @example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 @group
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 (symbol-name 'foo)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 @result{} "foo"
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 @end group
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 @end example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
276 @strong{Warning:} Changing the string by substituting characters does
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
277 change the name of the symbol, but fails to update the obarray, so don't
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
278 do it!
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 @defun make-symbol name
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 This function returns a newly-allocated, uninterned symbol whose name is
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 @var{name} (which must be a string). Its value and function definition
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 are void, and its property list is @code{nil}. In the example below,
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 the value of @code{sym} is not @code{eq} to @code{foo} because it is a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 distinct uninterned symbol whose name is also @samp{foo}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 @example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 (setq sym (make-symbol "foo"))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 @result{} foo
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 (eq sym 'foo)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 @result{} nil
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 @end example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 @defun intern name &optional obarray
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 This function returns the interned symbol whose name is @var{name}. If
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 there is no such symbol in the obarray @var{obarray}, @code{intern}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 creates a new one, adds it to the obarray, and returns it. If
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 @var{obarray} is omitted, the value of the global variable
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 @code{obarray} is used.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 @example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 (setq sym (intern "foo"))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 @result{} foo
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 (eq sym 'foo)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 @result{} t
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (setq sym1 (intern "foo" other-obarray))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 @result{} foo
23727
682a37afcb98 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 22138
diff changeset
311 (eq sym1 'foo)
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 @result{} nil
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 @end example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
316 @cindex CL note---interning existing symbol
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
317 @quotation
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
318 @b{Common Lisp note:} In Common Lisp, you can intern an existing symbol
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
319 in an obarray. In Emacs Lisp, you cannot do this, because the argument
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
320 to @code{intern} must be a string, not a symbol.
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
321 @end quotation
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
322
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 @defun intern-soft name &optional obarray
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 This function returns the symbol in @var{obarray} whose name is
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 @var{name}, or @code{nil} if @var{obarray} has no symbol with that name.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 Therefore, you can use @code{intern-soft} to test whether a symbol with
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327 a given name is already interned. If @var{obarray} is omitted, the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 value of the global variable @code{obarray} is used.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329
27385
f7b7fdb0f3f4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
330 The argument @var{name} may also be a symbol; in that case,
f7b7fdb0f3f4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
331 the function returns @var{name} if @var{name} is interned
f7b7fdb0f3f4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
332 in the specified obarray, and otherwise @code{nil}.
f7b7fdb0f3f4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 27189
diff changeset
333
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
334 @smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 (intern-soft "frazzle") ; @r{No such symbol exists.}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 @result{} nil
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 (make-symbol "frazzle") ; @r{Create an uninterned one.}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 @result{} frazzle
12282
586e3ea81792 updates for version 19.29 made by melissa; also needed to check out files
Melissa Weisshaus <melissa@gnu.org>
parents: 12128
diff changeset
339 @group
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (intern-soft "frazzle") ; @r{That one cannot be found.}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 @result{} nil
12282
586e3ea81792 updates for version 19.29 made by melissa; also needed to check out files
Melissa Weisshaus <melissa@gnu.org>
parents: 12128
diff changeset
342 @end group
586e3ea81792 updates for version 19.29 made by melissa; also needed to check out files
Melissa Weisshaus <melissa@gnu.org>
parents: 12128
diff changeset
343 @group
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (setq sym (intern "frazzle")) ; @r{Create an interned one.}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 @result{} frazzle
12282
586e3ea81792 updates for version 19.29 made by melissa; also needed to check out files
Melissa Weisshaus <melissa@gnu.org>
parents: 12128
diff changeset
346 @end group
586e3ea81792 updates for version 19.29 made by melissa; also needed to check out files
Melissa Weisshaus <melissa@gnu.org>
parents: 12128
diff changeset
347 @group
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (intern-soft "frazzle") ; @r{That one can be found!}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 @result{} frazzle
12282
586e3ea81792 updates for version 19.29 made by melissa; also needed to check out files
Melissa Weisshaus <melissa@gnu.org>
parents: 12128
diff changeset
350 @end group
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 @group
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 (eq sym 'frazzle) ; @r{And it is the same one.}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 @result{} t
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 @end group
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 @end smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 @defvar obarray
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 This variable is the standard obarray for use by @code{intern} and
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 @code{read}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 @end defvar
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362
56215
c9aa4127a482 Reposition @anchor's.
Luc Teirlinck <teirllm@auburn.edu>
parents: 53482
diff changeset
363 @defun mapatoms function &optional obarray
53482
7528710ec1a4 (Creating Symbols): Add anchor.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52991
diff changeset
364 @anchor{Definition of mapatoms}
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
365 This function calls @var{function} once with each symbol in the obarray
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
366 @var{obarray}. Then it returns @code{nil}. If @var{obarray} is
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
367 omitted, it defaults to the value of @code{obarray}, the standard
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
368 obarray for ordinary symbols.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 @smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 (setq count 0)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 @result{} 0
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (defun count-syms (s)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (setq count (1+ count)))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 @result{} count-syms
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 (mapatoms 'count-syms)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 @result{} nil
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 count
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 @result{} 1871
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 @end smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 See @code{documentation} in @ref{Accessing Documentation}, for another
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 example using @code{mapatoms}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
386 @defun unintern symbol &optional obarray
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
387 This function deletes @var{symbol} from the obarray @var{obarray}. If
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
388 @code{symbol} is not actually in the obarray, @code{unintern} does
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
389 nothing. If @var{obarray} is @code{nil}, the current obarray is used.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
390
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
391 If you provide a string instead of a symbol as @var{symbol}, it stands
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
392 for a symbol name. Then @code{unintern} deletes the symbol (if any) in
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
393 the obarray which has that name. If there is no such symbol,
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
394 @code{unintern} does nothing.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
395
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
396 If @code{unintern} does delete a symbol, it returns @code{t}. Otherwise
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
397 it returns @code{nil}.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
398 @end defun
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
399
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 @node Property Lists,, Creating Symbols, Symbols
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 @section Property Lists
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 @cindex property list
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 @cindex plist
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 A @dfn{property list} (@dfn{plist} for short) is a list of paired
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 elements stored in the property list cell of a symbol. Each of the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 pairs associates a property name (usually a symbol) with a property or
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 value. Property lists are generally used to record information about a
7118
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
409 symbol, such as its documentation as a variable, the name of the file
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
410 where it was defined, or perhaps even the grammatical class of the
08d61ef58d13 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6411
diff changeset
411 symbol (representing a word) in a language-understanding system.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 Character positions in a string or buffer can also have property lists.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 @xref{Text Properties}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 The property names and values in a property list can be any Lisp
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
417 objects, but the names are usually symbols. Property list functions
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
418 compare the property names using @code{eq}. Here is an example of a
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
419 property list, found on the symbol @code{progn} when the compiler is
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
420 loaded:
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 @example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (lisp-indent-function 0 byte-compile byte-compile-progn)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 @end example
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 @noindent
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 Here @code{lisp-indent-function} and @code{byte-compile} are property
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 names, and the other two elements are the corresponding values.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
430 @menu
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
431 * Plists and Alists:: Comparison of the advantages of property
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
432 lists and association lists.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
433 * Symbol Plists:: Functions to access symbols' property lists.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
434 * Other Plists:: Accessing property lists stored elsewhere.
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
435 @end menu
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
436
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
437 @node Plists and Alists
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
438 @subsection Property Lists and Association Lists
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
439
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 @cindex property lists vs association lists
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 Association lists (@pxref{Association Lists}) are very similar to
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 property lists. In contrast to association lists, the order of the
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 pairs in the property list is not significant since the property names
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 must be distinct.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 Property lists are better than association lists for attaching
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
447 information to various Lisp function names or variables. If your
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
448 program keeps all of its associations in one association list, it will
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
449 typically need to search that entire list each time it checks for an
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
450 association. This could be slow. By contrast, if you keep the same
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
451 information in the property lists of the function names or variables
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
452 themselves, each search will scan only the length of one property list,
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
453 which is usually short. This is why the documentation for a variable is
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
454 recorded in a property named @code{variable-documentation}. The byte
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
455 compiler likewise uses properties to record those functions needing
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
456 special treatment.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 However, association lists have their own advantages. Depending on
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 your application, it may be faster to add an association to the front of
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 an association list than to update a property. All properties for a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461 symbol are stored in the same property list, so there is a possibility
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 of a conflict between different uses of a property name. (For this
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
463 reason, it is a good idea to choose property names that are probably
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
464 unique, such as by beginning the property name with the program's usual
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
465 name-prefix for variables and functions.) An association list may be
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
466 used like a stack where associations are pushed on the front of the list
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
467 and later discarded; this is not possible with a property list.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
469 @node Symbol Plists
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
470 @subsection Property List Functions for Symbols
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
471
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 @defun symbol-plist symbol
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 This function returns the property list of @var{symbol}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 @defun setplist symbol plist
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
477 This function sets @var{symbol}'s property list to @var{plist}.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 Normally, @var{plist} should be a well-formed property list, but this is
52991
228cbf0968c7 (Symbol Plists): Mention return value of `setplist'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 52401
diff changeset
479 not enforced. The return value is @var{plist}.
6411
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 @smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 (setplist 'foo '(a 1 b (2 3) c nil))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 @result{} (a 1 b (2 3) c nil)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 (symbol-plist 'foo)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 @result{} (a 1 b (2 3) c nil)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 @end smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 For symbols in special obarrays, which are not used for ordinary
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 purposes, it may make sense to use the property list cell in a
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 nonstandard fashion; in fact, the abbrev mechanism does so
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
491 (@pxref{Abbrevs}).
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 @defun get symbol property
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
495 This function finds the value of the property named @var{property} in
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
496 @var{symbol}'s property list. If there is no such property, @code{nil}
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 is returned. Thus, there is no distinction between a value of
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 @code{nil} and the absence of the property.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 The name @var{property} is compared with the existing property names
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 using @code{eq}, so any object is a legitimate property.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 See @code{put} for an example.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 @end defun
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 @defun put symbol property value
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 This function puts @var{value} onto @var{symbol}'s property list under
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 the property name @var{property}, replacing any previous property value.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 The @code{put} function returns @var{value}.
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 @smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 (put 'fly 'verb 'transitive)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 @result{}'transitive
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 (put 'fly 'noun '(a buzzing little bug))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 @result{} (a buzzing little bug)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 (get 'fly 'verb)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 @result{} transitive
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 (symbol-plist 'fly)
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 @result{} (verb transitive noun (a buzzing little bug))
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 @end smallexample
aea7be7b925c Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 @end defun
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
522
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
523 @node Other Plists
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
524 @subsection Property Lists Outside Symbols
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
525
34014
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
526 These functions are useful for manipulating property lists
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
527 that are stored in places other than symbols:
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
528
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
529 @defun plist-get plist property
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
530 This returns the value of the @var{property} property
61728
5b01cec64cc9 (Symbol Plists): Remove safe-get, as get is now safe.
Kim F. Storm <storm@cua.dk>
parents: 61648
diff changeset
531 stored in the property list @var{plist}. For example,
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
532
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
533 @example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
534 (plist-get '(foo 4) 'foo)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
535 @result{} 4
58236
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
536 (plist-get '(foo 4 bad) 'foo)
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
537 @result{} 4
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
538 (plist-get '(foo 4 bad) 'bar)
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
539 @result{} @code{wrong-type-argument} error
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
540 @end example
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
541
61728
5b01cec64cc9 (Symbol Plists): Remove safe-get, as get is now safe.
Kim F. Storm <storm@cua.dk>
parents: 61648
diff changeset
542 It accepts a malformed @var{plist} argument and always returns @code{nil}
58236
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
543 if @var{property} is not found in the @var{plist}. For example,
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
544
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
545 @example
61728
5b01cec64cc9 (Symbol Plists): Remove safe-get, as get is now safe.
Kim F. Storm <storm@cua.dk>
parents: 61648
diff changeset
546 (plist-get '(foo 4 bad) 'bar)
58236
ff6fd8552b2f (Other Plists): Note that plist-get may signal error.
Kim F. Storm <storm@cua.dk>
parents: 56215
diff changeset
547 @result{} nil
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
548 @end example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
549 @end defun
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
550
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
551 @defun plist-put plist property value
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
552 This stores @var{value} as the value of the @var{property} property in
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
553 the property list @var{plist}. It may modify @var{plist} destructively,
12128
27144f55d1c6 fixed errors that appeared during update to 19.29.
Melissa Weisshaus <melissa@gnu.org>
parents: 12098
diff changeset
554 or it may construct a new list structure without altering the old. The
12098
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
555 function returns the modified property list, so you can store that back
a6eb5f12b0f3 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 12067
diff changeset
556 in the place where you got @var{plist}. For example,
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
557
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
558 @example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
559 (setq my-plist '(bar t foo 4))
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
560 @result{} (bar t foo 4)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
561 (setq my-plist (plist-put my-plist 'foo 69))
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
562 @result{} (bar t foo 69)
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
563 (setq my-plist (plist-put my-plist 'quux '(a)))
21007
66d807bdc5b4 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 12282
diff changeset
564 @result{} (bar t foo 69 quux (a))
12067
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
565 @end example
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
566 @end defun
73dc8205d259 *** empty log message ***
Karl Heuer <kwzh@gnu.org>
parents: 7734
diff changeset
567
21682
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
568 You could define @code{put} in terms of @code{plist-put} as follows:
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
569
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
570 @example
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
571 (defun put (symbol prop value)
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
572 (setplist symbol
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
573 (plist-put (symbol-plist symbol) prop value)))
90da2489c498 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 21007
diff changeset
574 @end example
34014
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
575
52191
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
576 @defun lax-plist-get plist property
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
577 Like @code{plist-get} except that it compares properties
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
578 using @code{equal} instead of @code{eq}.
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
579 @end defun
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
580
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
581 @defun lax-plist-put plist property value
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
582 Like @code{plist-put} except that it compares properties
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
583 using @code{equal} instead of @code{eq}.
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
584 @end defun
db7b7dd7c12c (Other Plists): Add lax-plist-get, lax-plist-put.
Richard M. Stallman <rms@gnu.org>
parents: 49600
diff changeset
585
34014
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
586 @defun plist-member plist property
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
587 This returns non-@code{nil} if @var{plist} contains the given
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
588 @var{property}. Unlike @code{plist-get}, this allows you to distinguish
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
589 between a missing property and a property with the value @code{nil}.
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
590 The value is actually the tail of @var{plist} whose @code{car} is
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
591 @var{property}.
4d3831f2899f plist-member
Dave Love <fx@gnu.org>
parents: 27385
diff changeset
592 @end defun
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52191
diff changeset
593
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52191
diff changeset
594 @ignore
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52191
diff changeset
595 arch-tag: 8750b7d2-de4c-4923-809a-d35fc39fd8ce
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52191
diff changeset
596 @end ignore