Collaboration diagram for Symbol:
The thing may be one specific thing, in which case it is called a Constant, or it may be a placeholder (for nothing/one thing/many things) in which case it is called a Variable. One special kind of Constant is a Literal, which is a sequence of characters.
This is a fairly abstract version of Symbol. Inference systems will probably need to translate from these symbols into their own internal symbols using a hash_map. We cannot simply provide a void* pointer for them, since these Symbols might be used in a variety of such subsystems at the same time. This is a performance cost of keeping the upper layer free from lower-layer details. (We could keep a pointer for some small number of subsystems. Hrm.)
This implementation uses an "atom table", so symbols are just indexes into table of internal symbol data (a Symbol::Record).
Should we reclaim slots in the atom table? That might require interactions with the lower layers, I'd think.
Definition at line 41 of file Symbol.h.