6.6.6.2 Symbols as Lookup Keys

Given their efficiency and descriptive power, it is natural to use symbols as the keys in an association list or hash table.

To illustrate this, consider a more structured representation of the car properties example from the preceding subsection. Rather than mixing all the properties up together in a flat list, we could use an association list like this:

(define car1-properties '((color . red)
                          (transmission . manual)
                          (fuel . unleaded)
                          (steering . power-assisted)))

Notice how this structure is more explicit and extensible than the flat list. For example it makes clear that manual refers to the transmission rather than, say, the windows or the locking of the car. It also allows further properties to use the same symbols among their possible values without becoming ambiguous:

(define car1-properties '((color . red)
                          (transmission . manual)
                          (fuel . unleaded)
                          (steering . power-assisted)
                          (seat-color . red)
                          (locking . manual)))

With a representation like this, it is easy to use the efficient assq-XXX family of procedures (see Association Lists) to extract or change individual pieces of information:

(assq-ref car1-properties 'fuel) ⇒ unleaded
(assq-ref car1-properties 'transmission) ⇒ manual

(assq-set! car1-properties 'seat-color 'black)
⇒
((color . red)
 (transmission . manual)
 (fuel . unleaded)
 (steering . power-assisted)
 (seat-color . black)
 (locking . manual)))

Hash tables also have keys, and exactly the same arguments apply to the use of symbols in hash tables as in association lists. The hash value that Guile uses to decide where to add a symbol-keyed entry to a hash table can be obtained by calling the symbol-hash procedure:

Scheme Procedure: symbol-hash symbol
C Function: scm_symbol_hash (symbol)

Return a hash value for symbol.

See Hash Tables for information about hash tables in general, and for why you might choose to use a hash table rather than an association list.