calc: User-Defined Compositions

 
 7.8.10.6 User-Defined Compositions
 ..................................
 
 The ‘Z C’ (‘calc-user-define-composition’) command lets you define the
 display format for any algebraic function.  You provide a formula
 containing a certain number of argument variables on the stack.  Any
 time Calc formats a call to the specified function in the current
 language mode and with that number of arguments, Calc effectively
 replaces the function call with that formula with the arguments
 replaced.
 
    Calc builds the default argument list by sorting all the variable
 names that appear in the formula into alphabetical order.  You can edit
 this argument list before pressing <RET> if you wish.  Any variables in
 the formula that do not appear in the argument list will be displayed
 literally; any arguments that do not appear in the formula will not
 affect the display at all.
 
    You can define formats for built-in functions, for functions you have
 defined with ‘Z F’ (SeeAlgebraic Definitions), or for functions
 which have no definitions but are being used as purely syntactic
 objects.  You can define different formats for each language mode, and
 for each number of arguments, using a succession of ‘Z C’ commands.
 When Calc formats a function call, it first searches for a format
 defined for the current language mode (and number of arguments); if
 there is none, it uses the format defined for the Normal language mode.
 If neither format exists, Calc uses its built-in standard format for
 that function (usually just ‘FUNC(ARGS)’).
 
    If you execute ‘Z C’ with the number 0 on the stack instead of a
 formula, any defined formats for the function in the current language
 mode will be removed.  The function will revert to its standard format.
 
    For example, the default format for the binomial coefficient function
 ‘choose(n, m)’ in the Big language mode is
 
       n
      ( )
       m
 
 You might prefer the notation,
 
       C
      n m
 
 To define this notation, first make sure you are in Big mode, then put
 the formula
 
      choriz([cvert([cvspace(1), n]), C, cvert([cvspace(1), m])])
 
 on the stack and type ‘Z C’.  Answer the first prompt with ‘choose’.
 The second prompt will be the default argument list of ‘(C m n)’.  Edit
 this list to be ‘(n m)’ and press <RET>.  Now, try it out: For example,
 turn simplification off with ‘m O’ and enter ‘choose(a,b) + choose(7,3)’
 as an algebraic entry.
 
       C  +  C
      a b   7 3
 
    As another example, let’s define the usual notation for Stirling
 numbers of the first kind, ‘stir1(n, m)’.  This is just like the regular
 format for binomial coefficients but with square brackets instead of
 parentheses.
 
      choriz([string("["), cvert([n, cbase(cvspace(1)), m]), string("]")])
 
    Now type ‘Z C stir1 <RET>’, edit the argument list to ‘(n m)’, and
 type <RET>.
 
    The formula provided to ‘Z C’ usually will involve composition
 functions, but it doesn’t have to.  Putting the formula ‘a + b + c’ onto
 the stack and typing ‘Z C foo <RET> <RET>’ would define the function
 ‘foo(x,y,z)’ to display like ‘x + y + z’.  This “sum” will act exactly
 like a real sum for all formatting purposes (it will be parenthesized
 the same, and so on).  However it will be computationally unrelated to a
 sum.  For example, the formula ‘2 * foo(1, 2, 3)’ will display as ‘2 (1
 + 2 + 3)’.  Operator precedences have caused the “sum” to be written in
 parentheses, but the arguments have not actually been summed.
 (Generally a display format like this would be undesirable, since it can
 easily be confused with a real sum.)
 
    The special function ‘eval’ can be used inside a ‘Z C’ composition
 formula to cause all or part of the formula to be evaluated at display
 time.  For example, if the formula is ‘a + eval(b + c)’, then ‘foo(1, 2,
 3)’ will be displayed as ‘1 + 5’.  Evaluation will use the default
 simplifications, regardless of the current simplification mode.  There
 are also ‘evalsimp’ and ‘evalextsimp’ which simplify as if by ‘a s’ and
 ‘a e’ (respectively).  Note that these “functions” operate only in the
 context of composition formulas (and also in rewrite rules, where they
 serve a similar purpose; SeeRewrite Rules).  On the stack, a call
 to ‘eval’ will be left in symbolic form.
 
    It is not a good idea to use ‘eval’ except as a last resort.  It can
 cause the display of formulas to be extremely slow.  For example, while
 ‘eval(a + b)’ might seem quite fast and simple, there are several
 situations where it could be slow.  For example, ‘a’ and/or ‘b’ could be
 polar complex numbers, in which case doing the sum requires
 trigonometry.  Or, ‘a’ could be the factorial ‘fact(100)’ which is
 unevaluated because you have typed ‘m O’; ‘eval’ will evaluate it anyway
 to produce a large, unwieldy integer.
 
    You can save your display formats permanently using the ‘Z P’ command
 (SeeCreating User Keys).