Attributes are used to inherit and synthesize information, and to also communicate it across top-level expression boundaries. An attribute has the following primitives:
make-attributes
attr
get-attribute
attr scheme-symbol (attr-entry + #f)
put-attribute
attr scheme-symbol attr-entry attr
make-attributes creates a new (empty) table of attributes. put-attribute updates the value of an attribute, adding it if not already present. get-attribute returns the value of the attribute, if present, and #f otherwise. The value of attr-entry is fixed by individual applications.