calc: Selections with Rewrite Rules

 
 11.11.9 Selections with Rewrite Rules
 -------------------------------------
 
 If a sub-formula of the current formula is selected (as by ‘j s’; See
 Selecting Subformulas), the ‘a r’ (‘calc-rewrite’) command applies
 only to that sub-formula.  Together with a negative prefix argument, you
 can use this fact to apply a rewrite to one specific part of a formula
 without affecting any other parts.
 
    The ‘j r’ (‘calc-rewrite-selection’) command allows more
 sophisticated operations on selections.  This command prompts for the
 rules in the same way as ‘a r’, but it then applies those rules to the
 whole formula in question even though a sub-formula of it has been
 selected.  However, the selected sub-formula will first have been
 surrounded by a ‘select( )’ function call.  (Calc’s evaluator does not
 understand the function name ‘select’; this is only a tag used by the ‘j
 r’ command.)
 
    For example, suppose the formula on the stack is ‘2 (a + b)^2’ and
 the sub-formula ‘a + b’ is selected.  This formula will be rewritten to
 ‘2 select(a + b)^2’ and then the rewrite rules will be applied in the
 usual way.  The rewrite rules can include references to ‘select’ to tell
 where in the pattern the selected sub-formula should appear.
 
    If there is still exactly one ‘select( )’ function call in the
 formula after rewriting is done, it indicates which part of the formula
 should be selected afterwards.  Otherwise, the formula will be
 unselected.
 
    You can make ‘j r’ act much like ‘a r’ by enclosing both parts of the
 rewrite rule with ‘select()’.  However, ‘j r’ allows you to use the
 current selection in more flexible ways.  Suppose you wished to make a
 rule which removed the exponent from the selected term; the rule
 ‘select(a)^x := select(a)’ would work.  In the above example, it would
 rewrite ‘2 select(a + b)^2’ to ‘2 select(a + b)’.  This would then be
 returned to the stack as ‘2 (a + b)’ with the ‘a + b’ selected.
 
    The ‘j r’ command uses one iteration by default, unlike ‘a r’ which
 defaults to 100 iterations.  A numeric prefix argument affects ‘j r’ in
 the same way as ‘a r’.  SeeNested Formulas with Rewrite Rules.
 
    As with other selection commands, ‘j r’ operates on the stack entry
 that contains the cursor.  (If the cursor is on the top-of-stack ‘.’
 marker, it works as if the cursor were on the formula at stack level 1.)
 
    If you don’t specify a set of rules, the rules are taken from the top
 of the stack, just as with ‘a r’.  In this case, the cursor must
 indicate stack entry 2 or above as the formula to be rewritten
 (otherwise the same formula would be used as both the target and the
 rewrite rules).
 
    If the indicated formula has no selection, the cursor position within
 the formula temporarily selects a sub-formula for the purposes of this
 command.  If the cursor is not on any sub-formula (e.g., it is in the
 line-number area to the left of the formula), the ‘select( )’ markers
 are ignored by the rewrite mechanism and the rules are allowed to apply
 anywhere in the formula.
 
    As a special feature, the normal ‘a r’ command also ignores ‘select(
 )’ calls in rewrite rules.  For example, if you used the above rule
 ‘select(a)^x := select(a)’ with ‘a r’, it would apply the rule as if it
 were ‘a^x := a’.  Thus, you can write general purpose rules with
 ‘select( )’ hints inside them so that they will “do the right thing” in
 both ‘a r’ and ‘j r’, both with and without selections.