|
|
1.1 root 1: .\" Copyright (c) 1980 Regents of the University of California.
2: .\" All rights reserved. The Berkeley software License Agreement
3: .\" specifies the terms and conditions for redistribution.
4: .\"
5: .\" @(#)ch17.n 6.2 (Berkeley) 5/14/86
6: .\"
7: ." $Header: ch17.n,v 40.1 84/08/08 21:36:08 layer Exp $
8: ." (c) Copyright 1984, Franz Inc., Berkeley California
9: .Lc Hash\ Tables 17
10: .sh 2 Overview \n(ch 1
11: .pp
12: A hash table is an object that can efficiently map a given object to another.
13: Each hash table is a collection of entries,
14: each of which associates a unique \fIkey\fP with a \fIvalue\fP.
15: There are elemental functions to add, delete, and find entries
16: based on a particular key.
17: Finding a value in a hash table is relatively fast compared to
18: looking up values in, for example, an assoc list or property list.
19: .pp
20: Adding a key to a hash table modifies the hash table, and so
21: it is a descructive operation.
22: .pp
23: There are two different kinds of hash tables: those that use the
24: function \fIequal\fP for the comparing of keys, and those that
25: use \fIeq\fP, the default.
26: If a key is "eq" to another object, then a match is assumed.
27: Likewise with "equal".
28: .sh 2 Functions
29: .Lf makeht "'x_size ['s_test]"
30: .Re
31: A hash table of x_size hash buckets.
32: If present, s_test is used as the test to compare keys in the
33: hash table, the default being \fBeq\fP.
34: \fIEqual\fP might be used to create a hash table where the
35: keys are to be lists (or any lisp object).
36: .No
37: At this time, hash tables are implemented on top of vectors.
38: .Lf hash-table-p "'H_arg"
39: .Re
40: t if H_arg is a hash table.
41: .No
42: Since hash tables are really vectors, the lisp type of a hash table
43: is a vector, so that given a vector, this function will return t.
44: .Lf gethash "'g_key 'H_htable ['g_default]"
45: .Re
46: the value associated the key g_key in hash table H_htable.
47: If there is not an entry given by the key and g_default is specified,
48: then g_default is returned, otherwise, a symbol that is unbound
49: is returned.
50: This is so that \fBnil\fP can be a associated with a key.
51: .No
52: \fIsetf\fP may be used to set the value assocaited with a key.
53: .Lf remhash "'g_key 'H_htable"
54: .Re
55: t if there was an entry for g_key in the hash table
56: H_htable, nil otherwise. In the case of a match, the
57: entry and associated object are removed from the hash
58: table.
59: .Lf maphash "'u_func 'H_htable"
60: .Re
61: nil.
62: .No
63: The function u_func is applied to every element in the
64: hash table H_htable. The function is called with two arguments:
65: the key and value of an element.
66: The mapped function should not add or delete object from the
67: table because the results would be unpredicable.
68: .Lf clrhash "'H_htable"
69: .Re
70: the hash table cleared of all entries.
71: .Lf hash-table-count "'H_htable"
72: .Re
73: the number of entries in H_htable. Given a new hash table
74: with no entries, this function returns zero.
75: .Eb
76: ; make a vanilla hash table using "eq" to compare items...
77: \-> (setq black-box (makeht 20))
78: hash-table[26]
79: \-> (hash-table-p black-box)
80: t
81: \-> (hash-table-count black-box)
82: 0
83: \-> (setf (gethash 'key black-box) '(the value associated with the key))
84: key
85: \-> (gethash 'key black-box)
86: (the value associated with the key)
87: \-> (hash-table-count black-box)
88: 1
89: \-> (addhash 'composer black-box 'franz)
90: composer
91: \-> (gethash 'composer black-box)
92: franz
93: \-> (maphash '(lambda (key val) (msg "key " key " value " val N)) black-box)
94: key composer value franz
95: key key value (the value associated with the key)
96: nil
97: \-> (clrhash black-box)
98: hash-table[26]
99: \-> (hash-table-count black-box)
100: 0
101: \-> (maphash '(lambda (key val) (msg "key " key " value " val N)) black-box)
102: nil
103:
104: ; here is an example using "equal" as the comparator
105: \-> (setq ht (makeht 10 'equal))
106: hash-table[16]
107: \-> (setf (gethash '(this is a key) ht) '(and this is the value))
108: (this is a key)
109: \-> (gethash '(this is a key) ht)
110: (and this is the value)
111: ; the reader makes a new list each time you type it...
112: \-> (setq x '(this is a key))
113: (this is a key)
114: \-> (setq y '(this is a key))
115: (this is a key)
116: ; so these two lists are really different lists that compare "equal"
117: ; not "eq"
118: \-> (eq x y)
119: nil
120: ; but since we are using "equal" to compare keys, we are OK...
121: \-> (gethash x ht)
122: (and this is the value)
123: \-> (gethash y ht)
124: (and this is the value)
125: .Ee
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.