Annotation of 43BSD/ucb/lisp/lisplib/manual/ch17.r, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: 
                      4: 
                      5: 
                      6: 
                      7: 
                      8:                         CHAPTER  17
                      9: 
                     10: 
                     11:                         Hash Tables
                     12: 
                     13: 
                     14: 
                     15: 
                     16: 
                     17: 
                     18:    1.1.  Overview
                     19: 
                     20:            A hash table is an object  that  can  efficiently
                     21:       map  a  given object to another.  Each hash table is a
                     22:       collection of entries,  each  of  which  associates  a
                     23:       unique  _k_e_y  with  a _v_a_l_u_e.  There are elemental func-
                     24:       tions to add, delete, and find entries based on a par-
                     25:       ticular key.  Finding a value in a hash table is rela-
                     26:       tively fast compared to  looking  up  values  in,  for
                     27:       example, an assoc list or property list.
                     28: 
                     29:            Adding a key to a hash table  modifies  the  hash
                     30:       table, and so it is a descructive operation.
                     31: 
                     32:            There are two different  kinds  of  hash  tables:
                     33:       those that use the function _e_q_u_a_l for the comparing of
                     34:       keys, and those that use _e_q, the default.  If a key is
                     35:       "eq"  to  another  object,  then  a  match is assumed.
                     36:       Likewise with "equal".
                     37: 
                     38: 
                     39: 
                     40:    1.2.  Functions
                     41: 
                     42: (makeht 'x_size ['s_test])
                     43: 
                     44:      RETURNS: A hash  table  of  x_size  hash  buckets.   If
                     45:               present, s_test is used as the test to compare
                     46:               keys in the hash table, the default being  eq.
                     47:               _E_q_u_a_l  might  be  used  to create a hash table
                     48:               where the keys are to be lists  (or  any  lisp
                     49:               object).
                     50: 
                     51:      NOTE: At this time, hash tables are implemented on  top
                     52:            of vectors.
                     53: 
                     54: 
                     55: 
                     56: 
                     57: 
                     58: 
                     59: 
                     60: 9
                     61: 
                     62: 9Hash Tables                                             17-1
                     63: 
                     64: 
                     65: 
                     66: 
                     67: 
                     68: 
                     69: 
                     70: Hash Tables                                             17-2
                     71: 
                     72: 
                     73: (hash-table-p 'H_arg)
                     74: 
                     75:      RETURNS: t if H_arg is a hash table.
                     76: 
                     77:      NOTE: Since hash tables are really  vectors,  the  lisp
                     78:            type of a hash table is a vector, so that given a
                     79:            vector, this function will return t.
                     80: 
                     81: (gethash 'g_key 'H_htable ['g_default])
                     82: 
                     83:      RETURNS: the value associated the  key  g_key  in  hash
                     84:               table  H_htable.   If  there  is  not an entry
                     85:               given by the key and g_default  is  specified,
                     86:               then  g_default is returned, otherwise, a sym-
                     87:               bol that is unbound is returned.  This  is  so
                     88:               that nil can be a associated with a key.
                     89: 
                     90:      NOTE: _s_e_t_f may be used to set the value assocaited with
                     91:            a key.
                     92: 
                     93: (remhash 'g_key 'H_htable)
                     94: 
                     95:      RETURNS: t if there was an entry for g_key in the  hash
                     96:               table H_htable, nil otherwise.  In the case of
                     97:               a match, the entry and associated  object  are
                     98:               removed from the hash table.
                     99: 
                    100: (maphash 'u_func 'H_htable)
                    101: 
                    102:      RETURNS: nil.
                    103: 
                    104:      NOTE: The function u_func is applied to  every  element
                    105:            in  the  hash  table  H_htable.   The function is
                    106:            called with two arguments: the key and  value  of
                    107:            an  element.   The mapped function should not add
                    108:            or delete  object  from  the  table  because  the
                    109:            results would be unpredicable.
                    110: 
                    111: (clrhash 'H_htable)
                    112: 
                    113:      RETURNS: the hash table cleared of all entries.
                    114: 
                    115: 
                    116: 
                    117: 
                    118: 
                    119: 
                    120: 
                    121: 
                    122: 
                    123: 
                    124: 
                    125: 9
                    126: 
                    127: 9                                       Printed: May 22, 1985
                    128: 
                    129: 
                    130: 
                    131: 
                    132: 
                    133: 
                    134: 
                    135: Hash Tables                                             17-3
                    136: 
                    137: 
                    138: (hash-table-count 'H_htable)
                    139: 
                    140:      RETURNS: the number of entries in  H_htable.   Given  a
                    141:               new  hash table with no entries, this function
                    142:               returns zero.
                    143: 
                    144: 
                    145: 
                    146: 
                    147: 
                    148: 
                    149: 
                    150: 
                    151: 
                    152: 
                    153: 
                    154: 
                    155: 
                    156: 
                    157: 
                    158: 
                    159: 
                    160: 
                    161: 
                    162: 
                    163: 
                    164: 
                    165: 
                    166: 
                    167: 
                    168: 
                    169: 
                    170: 
                    171: 
                    172: 
                    173: 
                    174: 
                    175: 
                    176: 
                    177: 
                    178: 
                    179: 
                    180: 
                    181: 
                    182: 
                    183: 
                    184: 
                    185: 
                    186: 
                    187: 
                    188: 
                    189: 
                    190: 9
                    191: 
                    192: 9                                       Printed: May 22, 1985
                    193: 
                    194: 
                    195: 
                    196: 
                    197: 
                    198: 
                    199: 
                    200: Hash Tables                                             17-4
                    201: 
                    202: 
                    203: 
                    204:     ____________________________________________________
                    205: 
                    206:     ; make a vanilla hash table using "eq" to compare items...
                    207:     -> (setq black-box (makeht 20))
                    208:     hash-table[26]
                    209:     -> (hash-table-p black-box)
                    210:     t
                    211:     -> (hash-table-count black-box)
                    212:     0
                    213:     -> (setf (gethash 'key black-box) '(the value associated with the key))
                    214:     key
                    215:     -> (gethash 'key black-box)
                    216:     (the value associated with the key)
                    217:     -> (hash-table-count black-box)
                    218:     1
                    219:     -> (addhash 'composer black-box 'franz)
                    220:     composer
                    221:     -> (gethash 'composer black-box)
                    222:     franz
                    223:     -> (maphash '(lambda (key val) (msg "key " key " value " val N)) black-box)
                    224:     key composer value franz
                    225:     key key value (the value associated with the key)
                    226:     nil
                    227:     -> (clrhash black-box)
                    228:     hash-table[26]
                    229:     -> (hash-table-count black-box)
                    230:     0
                    231:     -> (maphash '(lambda (key val) (msg "key " key " value " val N)) black-box)
                    232:     nil
                    233: 
                    234:     ; here is an example using "equal" as the comparator
                    235:     -> (setq ht (makeht 10 'equal))
                    236:     hash-table[16]
                    237:     -> (setf (gethash '(this is a key) ht) '(and this is the value))
                    238:     (this is a key)
                    239:     -> (gethash '(this is a key) ht)
                    240:     (and this is the value)
                    241:     ; the reader makes a new list each time you type it...
                    242:     -> (setq x '(this is a key))
                    243:     (this is a key)
                    244:     -> (setq y '(this is a key))
                    245:     (this is a key)
                    246:     ; so these two lists are really different lists that compare "equal"
                    247:     ; not "eq"
                    248:     -> (eq x y)
                    249:     nil
                    250:     ; but since we are using "equal" to compare keys, we are OK...
                    251:     -> (gethash x ht)
                    252:     (and this is the value)
                    253:     -> (gethash y ht)
                    254:     (and this is the value)
                    255:     ____________________________________________________
                    256: 
                    257: 
                    258:                                        Printed: May 22, 1985
                    259: 
                    260: 
                    261: 
                    262: 
                    263: 
                    264: 
                    265: 
                    266: Hash Tables                                             17-5
                    267: 
                    268: 
                    269: 
                    270: 
                    271: 
                    272: 
                    273: 
                    274: 
                    275: 
                    276: 
                    277: 
                    278: 
                    279: 
                    280: 
                    281: 
                    282: 
                    283: 
                    284: 
                    285: 
                    286: 
                    287: 
                    288: 
                    289: 
                    290: 
                    291: 
                    292: 
                    293: 
                    294: 
                    295: 
                    296: 
                    297: 
                    298: 
                    299: 
                    300: 
                    301: 
                    302: 
                    303: 
                    304: 
                    305: 
                    306: 
                    307: 
                    308: 
                    309: 
                    310: 
                    311: 
                    312: 
                    313: 
                    314: 
                    315: 
                    316: 
                    317: 
                    318: 
                    319: 
                    320: 
                    321: 9
                    322: 
                    323: 9                                       Printed: May 22, 1985
                    324: 
                    325: 
                    326: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.