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:
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.