diff man/lispref/hash-tables.texi @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 8626e4521993
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/lispref/hash-tables.texi	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,151 @@
+@c -*-texinfo-*-
+@c This is part of the XEmacs Lisp Reference Manual.
+@c Copyright (C) 1996 Ben Wing.
+@c See the file lispref.texi for copying conditions.
+@setfilename ../../info/hash-tables.info
+@node Hash Tables, Range Tables, Display, top
+@chapter Hash Tables
+@cindex hash table
+
+@defun hashtablep object
+This function returns non-@code{nil} if @var{object} is a hash table.
+@end defun
+
+@menu
+* Introduction to Hash Tables::	Hash tables are fast data structures for
+                                implementing simple tables (i.e. finite
+                                mappings from keys to values).
+* Working With Hash Tables::    Hash table functions.
+* Weak Hash Tables::            Hash tables with special garbage-collection
+                                behavior.
+@end menu
+
+@node Introduction to Hash Tables
+@section Introduction to Hash Tables
+
+A hash table is a data structure that provides mappings from
+arbitrary Lisp objects (called @dfn{keys}) to other arbitrary Lisp
+objects (called @dfn{values}).  There are many ways other than
+hash tables of implementing the same sort of mapping, e.g.
+association lists (@pxref{Association Lists}) and property lists
+(@pxref{Property Lists}), but hash tables provide much faster lookup.
+
+When you create a hash table, you specify a size, which indicates the
+expected number of elements that the table will hold.  You are not
+bound by this size, however; hash tables automatically resize themselves
+if the number of elements becomes too large.
+
+(Internally, hash tables are hashed using a modification of the
+@dfn{linear probing} hash table method.  This method hashes each
+key to a particular spot in the hash table, and then scans forward
+sequentially until a blank entry is found.  To look up a key, hash
+to the appropriate spot, then search forward for the key until either
+a key is found or a blank entry stops the search.  The modification
+actually used is called @dfn{double hashing} and involves moving forward
+by a fixed increment, whose value is computed from the original hash
+value, rather than always moving forward by one.  This eliminates
+problems with clustering that can arise from the simple linear probing
+method.  For more information, see @cite{Algorithms} (second edition)
+by Robert Sedgewick, pp. 236-241.)
+
+@defun make-hashtable size &optional test-fun
+This function makes a hash table of initial size @var{size}.  Comparison
+between keys is normally done with @code{eql}; i.e. two keys must be the
+same object to be considered equivalent.  However, you can explicitly
+specify the comparison function using @var{test-fun}, which must be
+one of @code{eq}, @code{eql}, or @code{equal}.
+
+Note that currently, @code{eq} and @code{eql} are the same.  This will
+change when bignums are implemented.
+@end defun
+
+@defun copy-hashtable old-table
+This function makes a new hash table which contains the same keys and
+values as the given table.  The keys and values will not themselves be
+copied.
+@end defun
+
+@defun hashtable-fullness table
+This function returns number of entries in @var{table}.
+@end defun
+
+@node Working With Hash Tables
+@section Working With Hash Tables
+
+@defun puthash key val table
+This function hashes @var{key} to @var{val} in @var{table}.
+@end defun
+
+@defun gethash key table &optional default
+This function finds the hash value for @var{key} in @var{table}.  If
+there is no corresponding value, @var{default} is returned (defaults to
+@code{nil}).
+@end defun
+
+@defun remhash key table
+This function removes the hash value for @var{key} in @var{table}.
+@end defun
+
+@defun clrhash table
+This function flushes @var{table}.  Afterwards, the hash table will
+contain no entries.
+@end defun
+
+@defun maphash function table
+This function maps @var{function} over entries in @var{table}, calling
+it with two args, each key and value in the table.
+@end defun
+
+@node Weak Hash Tables
+@section Weak Hash Tables
+@cindex hash table, weak
+@cindex weak hash table
+
+A @dfn{weak hash table} is a special variety of hash table whose
+elements do not count as GC referents.  For any key-value pair in such a
+hash table, if either the key or value (or in some cases, if one
+particular one of the two) has no references to it outside of weak hash
+tables (and similar structures such as weak lists), the pair will be
+removed from the table, and the key and value collected.  A non-weak
+hash table (or any other pointer) would prevent the objects from being
+collected.
+
+Weak hash tables are useful for keeping track of information in a
+non-obtrusive way, for example to implement caching.  If the cache
+contains objects such as buffers, markers, image instances, etc. that
+will eventually disappear and get garbage-collected, using a weak hash
+table ensures that these objects are collected normally rather than
+remaining around forever, long past their actual period of use.
+(Otherwise, you'd have to explicitly map over the hash table every so
+often and remove unnecessary elements.)
+
+There are three types of weak hash tables:
+
+@table @asis
+@item fully weak hash tables
+In these hash tables, a pair disappears if either the key or the value
+is unreferenced outside of the table.
+@item key-weak hash tables
+In these hash tables, a pair disappears if the key is unreferenced outside
+of the table, regardless of how the value is referenced.
+@item value-weak hash tables
+In these hash tables, a pair disappears if the value is unreferenced outside
+of the table, regardless of how the key is referenced.
+@end table
+
+Also see @ref{Weak Lists}.
+
+@defun make-weak-hashtable size &optional test-fun
+This function makes a fully weak hash table of initial size @var{size}.
+@var{test-fun} is as in @code{make-hashtable}.
+@end defun
+
+@defun make-key-weak-hashtable size &optional test-fun
+This function makes a key-weak hash table of initial size @var{size}.
+@var{test-fun} is as in @code{make-hashtable}.
+@end defun
+
+@defun make-value-weak-hashtable size &optional test-fun
+This function makes a value-weak hash table of initial size @var{size}.
+@var{test-fun} is as in @code{make-hashtable}.
+@end defun