General:. The #bag
object is a skip list (behaves like a balanced binary tree). It allows multiple
(non-unique keys) and multiple (non-unique key/value pairs) associations.
Simple insertion and display as a
sequence: This illustrates how values and keys are entered into a bag. The
:seq method returns the whole bag as a sequence of couplets. It is
useful for illustrating the concepts and for testing but would not likely find
use for large bags.
Access (indexing): When you
access (index) a bag by key, you are returned all value instances for that key
as a sequence of sequences. If you supply a single index you can just
"disclose" (<) the result to get the sequence of values
for the key. If you supply more than one key (as in this example), you will
index out of the resulting sequence in correspondence to the order in which you
supplied the indices. If you supply an invalid key, the contents of the
corresponding item in the result will contain nothing (as illustrated here for
'x' )
Remove ( ~ ): Vector
operations should be intuitive. They perform extension of single keys to
multiple values and single values to multiple keys. They do not force
conformity as some of the vector objects do. This is because there is usually
no logical meaning for putting 3 things into two places. For removal, key value
pairs are supplied (as in this case we have two such pairs). The
"without" operator ( ~ ) leaves the bag without that
key/value pair. Other identical key/value pairs remain. As with dictionaries,
it is illogical to return the entire index as the result (it could be huge).
Thus, the removals are done "in place".
Remove By Key: You remove all
items for a given key by just supplying the key alone.
Remove with ambiguity: Notice in
this example, there can be ambiguity when I remove. Do I mean remove the
"dk3/ck" key/value pair? Or do I mean remove the
"dk3" key and the "ck" key. To remove the
ambiguity enclose ('dk3' 'ck'>). Without the enclose (
> ) I would remove all the dk3's and all the ck's. I
need to get some experience with describing removals that can have this kind of
ambiguity. I want the power but I don't want the risk. If I find this
problematic, I will fall back to the less risky capability. Be careful and
experiment.