annotate man/lispref/hash-tables.texi @ 4792:95b04754ea8c

Make #'equalp more compatible with CL; add a compiler macro, test & doc it. lisp/ChangeLog addition: 2009-11-08 Aidan Kehoe <kehoea@parhasard.net> * cl-extra.el (cl-string-vector-equalp) (cl-bit-vector-vector-equalp, cl-vector-array-equalp) (cl-hash-table-contents-equalp): New functions, to implement equalp treating arrays with identical contents as equivalent, as specified by Common Lisp. (equalp): Revise this function to implement array equivalence, and the hash-table equalp behaviour specified by CL. * cl-macs.el (equalp): Add a compiler macro for this function, used when one of the arguments is constant, and as such, its type is known at compile time. man/ChangeLog addition: 2009-11-08 Aidan Kehoe <kehoea@parhasard.net> * lispref/objects.texi (Equality Predicates): Document #'equalp here, as well as #'equal and #'eq. tests/ChangeLog addition: 2009-12-31 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Test much of the functionality of equalp; add a pointer to Paul Dietz' ANSI test suite for this function, converted to Emacs Lisp. Not including the tests themselves in XEmacs because who owns the copyright on the files is unclear and the GCL people didn't respond to my queries.
author Aidan Kehoe <kehoea@parhasard.net>
date Thu, 31 Dec 2009 15:09:41 +0000
parents abe6d1db359e
children e6dec75ded0e
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 @c -*-texinfo-*-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 @c This is part of the XEmacs Lisp Reference Manual.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 @c Copyright (C) 1996 Ben Wing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 @c See the file lispref.texi for copying conditions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 @setfilename ../../info/hash-tables.info
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 @node Hash Tables, Range Tables, Display, top
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 @chapter Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 @cindex hash table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 @defun hash-table-p object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 This function returns @code{t} if @var{object} is a hash table, else @code{nil}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 @menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 * Introduction to Hash Tables:: Hash tables are fast data structures for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 implementing simple tables (i.e. finite
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 mappings from keys to values).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 * Working With Hash Tables:: Hash table functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 * Weak Hash Tables:: Hash tables with special garbage-collection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 behavior.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 @end menu
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 @node Introduction to Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 @section Introduction to Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 A @dfn{hash table} is a data structure that provides mappings from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 arbitrary Lisp objects called @dfn{keys} to other arbitrary Lisp objects
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 called @dfn{values}. A key/value pair is sometimes called an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 @dfn{entry} in the hash table. There are many ways other than hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 tables of implementing the same sort of mapping, e.g. association lists
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 (@pxref{Association Lists}) and property lists (@pxref{Property Lists}),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 but hash tables provide much faster lookup when there are many entries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 in the mapping. Hash tables are an implementation of the abstract data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 type @dfn{dictionary}, also known as @dfn{associative array}.
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 Internally, hash tables are hashed using the @dfn{linear probing} hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 table implementation method. This method hashes each key to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 particular spot in the hash table, and then scans forward sequentially
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 until a blank entry is found. To look up a key, hash to the appropriate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 spot, then search forward for the key until either a key is found or a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 blank entry stops the search. This method is used in preference to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 double hashing because of changes in recent hardware. The penalty for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 non-sequential access to memory has been increasing, and this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 compensates for the problem of clustering that linear probing entails.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 When hash tables are created, the user may (but is not required to)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 specify initial properties that influence performance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 Use the @code{:size} parameter to specify the number of entries that are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 likely to be stored in the hash table, to avoid the overhead of resizing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 the table. But if the pre-allocated space for the entries is never
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 used, it is simply wasted and makes XEmacs slower. Excess unused hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 table entries exact a small continuous performance penalty, since they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 must be scanned at every garbage collection. If the number of entries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 in the hash table is unknown, simply avoid using the @code{:size}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 keyword.
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 Use the @code{:rehash-size} and @code{:rehash-threshold} keywords to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 adjust the algorithm for deciding when to rehash the hash table. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 temporary hash tables that are going to be very heavily used, use a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 small rehash threshold, for example, 0.4 and a large rehash size, for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 example 2.0. For permanent hash tables that will be infrequently used,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 specify a large rehash threshold, for example 0.8.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 Hash tables can also be created by the lisp reader using structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 syntax, for example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 @example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 #s(hash-table size 20 data (foo 1 bar 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 @end example
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 The structure syntax accepts the same keywords as @code{make-hash-table}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (without the @code{:} character), as well as the additional keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 @code{data}, which specifies the initial hash table contents.
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 @defun make-hash-table &key @code{test} @code{size} @code{rehash-size} @code{rehash-threshold} @code{weakness}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 This function returns a new empty hash table object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 Keyword @code{:test} can be @code{eq}, @code{eql} (default) or @code{equal}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 Comparison between keys is done using this function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 If speed is important, consider using @code{eq}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 When storing strings in the hash table, you will likely need to use @code{equal}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 Keyword @code{:size} specifies the number of keys likely to be inserted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 This number of entries can be inserted without enlarging the hash table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 Keyword @code{:rehash-size} must be a float greater than 1.0, and specifies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 the factor by which to increase the size of the hash table when enlarging.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 Keyword @code{:rehash-threshold} must be a float between 0.0 and 1.0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 and specifies the load factor of the hash table which triggers enlarging.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
92 Non-standard keyword @code{:weakness} can be @code{nil} (default),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
93 @code{t}, @code{key-and-value}, @code{key}, @code{value} or
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
94 @code{key-or-value}. @code{t} is an alias for @code{key-and-value}.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
96 A key-and-value-weak hash table, also known as a fully-weak or simply
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
97 as a weak hash table, is one whose pointers do not count as GC
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
98 referents: for any key-value pair in the hash table, if the only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
99 remaining pointer to either the key or the value is in a weak hash
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
100 table, then the pair will be removed from the hash table, and the key
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
101 and value collected. A non-weak hash table (or any other pointer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
102 would prevent the object from being collected.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 A key-weak hash table is similar to a fully-weak hash table except that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 a key-value pair will be removed only if the key remains unmarked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 outside of weak hash tables. The pair will remain in the hash table if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 the key is pointed to by something other than a weak hash table, even
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 if the value is not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 A value-weak hash table is similar to a fully-weak hash table except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 that a key-value pair will be removed only if the value remains
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 unmarked outside of weak hash tables. The pair will remain in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 hash table if the value is pointed to by something other than a weak
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 hash table, even if the key is not.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
115
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
116 A key-or-value-weak hash table is similar to a fully-weak hash table except
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
117 that a key-value pair will be removed only if the value and the key remain
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
118 unmarked outside of weak hash tables. The pair will remain in the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
119 hash table if the value or key are pointed to by something other than a weak
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
120 hash table, even if the other is not.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 @defun copy-hash-table hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 This function returns a new hash table which contains the same keys and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 values as @var{hash-table}. The keys and values will not themselves be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 copied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 @end defun
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 @defun hash-table-count hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 This function returns the number of entries in @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 @defun hash-table-test hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 This function returns the test function of @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 This can be one of @code{eq}, @code{eql} or @code{equal}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 @defun hash-table-size hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 This function returns the current number of slots in @var{hash-table},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 whether occupied or not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 @defun hash-table-rehash-size hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 This function returns the current rehash size of @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 This is a float greater than 1.0; the factor by which @var{hash-table}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 is enlarged when the rehash threshold is exceeded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 @defun hash-table-rehash-threshold hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 This function returns the current rehash threshold of @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 This is a float between 0.0 and 1.0; the maximum @dfn{load factor} of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 @var{hash-table}, beyond which the @var{hash-table} is enlarged by rehashing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 @defun hash-table-weakness hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 This function returns the weakness of @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 This can be one of @code{nil}, @code{t}, @code{key} or @code{value}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 @node Working With Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 @section Working With Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 @defun puthash key value hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 This function hashes @var{key} to @var{value} in @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 @defun gethash key hash-table &optional default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 This function finds the hash value for @var{key} in @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 If there is no entry for @var{key} in @var{hash-table}, @var{default} is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 returned (which in turn defaults to @code{nil}).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 @defun remhash key hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 This function removes the entry for @var{key} from @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 Does nothing if there is no entry for @var{key} in @var{hash-table}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 @defun clrhash hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 This function removes all entries from @var{hash-table}, leaving it empty.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 @end defun
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 @defun maphash function hash-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 This function maps @var{function} over entries in @var{hash-table},
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 calling it with two args, each key and value in the hash table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 @var{function} may not modify @var{hash-table}, with the one exception
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 that @var{function} may remhash or puthash the entry currently being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 processed by @var{function}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 @end defun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 @node Weak Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 @section Weak Hash Tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 @cindex hash table, weak
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 @cindex weak hash table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 A @dfn{weak hash table} is a special variety of hash table whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 elements do not count as GC referents. For any key-value pair in such a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 hash table, if either the key or value (or in some cases, if one
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 particular one of the two) has no references to it outside of weak hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 tables (and similar structures such as weak lists), the pair will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 removed from the table, and the key and value collected. A non-weak
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 hash table (or any other pointer) would prevent the objects from being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 collected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 Weak hash tables are useful for keeping track of information in a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 non-obtrusive way, for example to implement caching. If the cache
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 contains objects such as buffers, markers, image instances, etc. that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 will eventually disappear and get garbage-collected, using a weak hash
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 table ensures that these objects are collected normally rather than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 remaining around forever, long past their actual period of use.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (Otherwise, you'd have to explicitly map over the hash table every so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 often and remove unnecessary elements.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
215 There are four types of weak hash tables:
428
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 @asis
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
218 @item key-and-value-weak hash tables
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
219 In these hash tables, also known as fully weak or simply as weak hash
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
220 tables, a pair disappears if either the key or the value is unreferenced
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
221 outside of the table.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 @item key-weak hash tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 In these hash tables, a pair disappears if the key is unreferenced outside
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 of the table, regardless of how the value is referenced.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 @item value-weak hash tables
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 In these hash tables, a pair disappears if the value is unreferenced outside
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 of the table, regardless of how the key is referenced.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
228 @item key-or-value-weak hash tables
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
229 In these hash tables, a pair disappears if both the key and the value
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
230 are unreferenced outside of the table.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 @end table
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 Also see @ref{Weak Lists}.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 Weak hash tables are created by specifying the @code{:weakness} keyword to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 @code{make-hash-table}.