Graph searching
When the user changes the value of a cell, we need to find the cells that need to be re-evaluated. Again, note the difference between source and target sets. While only formula cells can have non-empty source sets, all kinds of cells (also empty cells) can have non-empty target sets. Another difference between the two sets is that the target sets are defined indirectly by formulas in other cells. If a formula of another cell holds a reference to a particular cell, the reference to the formula cell is added to the target set of the particular cell. In the same way, when a formula is altered or cleared, the reference to that cell is removed from the target sets of all its source cells. When a cell is updated, all its targets are evaluated recursively–the targets cells are re-evaluated, then their target cells are re-evaluated, and so on. The evaluation always terminates when there are no more targets left, or when a circular reference is encountered. We always run out of targets...