If you have defined a DataSeries ds which has a value labeled a, then to access that value, you must enter ds[a].
However, after using the with(ds) command, you can use the label a directly, without specifying the DataSeries to which the value belongs.
As illustrated in the previous example, a list of the DataSeries labels bound to the top level is returned by with.
Sometimes a label is identical to a top-level name with a global meaning. Global names are still fully accessible. To access the global name a after having bound a DataSeries that has a label a, use the prefix form of the operator, as in .
For example, the variable a may be in use.
After issuing a call to with(ds), in which the name a occurs as a label, the name a now refers to the value corresponding to that label. The original variable is still available by using the syntax :-a.
In addition, two or more DataSeries may have values with some of the same names. In this case, if both are bound using with, only the most recently bound value will be available at the top level by using a single variable name. In the following example, that is ds2.
You can still refer to a value of any other DataSeries by naming the DataSeries it comes from, using syntax of the form ds[':-a']. If you were to write just ds[a], then the variable a would first evaluate to the corresponding value of ds2, and ds cannot infer which value is meant. This results in an error message. Using the syntax :-a makes sure that the global name a is used, not the value name from ds2. In this case, that global name was assigned a value (namely, 12.3); we do not want :-a to evaluate to that value either: if it would, then ds could still not infer which value is meant. In order to prevent :-a from evaluating, we use unevaluation quotes.