formatEquation.frink

View or download formatEquation.frink in plain text format


/** This contains functions for formatting equations into a traditional form,
    notably putting numerators above denominators in the result.   For example,
    this turns

    a d^-1 (b + e)^-1

    to

        a    
    ─────────
    d (b + e)

    This will hopefully be put into Frink as a new formatter.
*/


/** Formats an expression */
formatExpression[eq] :=
{
   [num, denom] = frac = numeratorDenominator[eq]
   if denom != 1
//      return formatTable[frac, "center", "center", "\u2500"]
   return formatTable[[formatExpression[num], formatExpression[denom]], "center", "center", "\u2500"]

   type = type[eq]

   if  type == "Add"
      return formatAdd[eq]

   if type == "Multiply"
      return formatMultiply[eq]

   if type == "Power"
      return formatPower[eq]

   if type == "FunctionCall"
      return formatFunctionCall[eq]

   if isOperator[eq]
   {
      op = getOperatorSymbol[eq]
      if op == " === " or op == " = "
         return formatOperator[eq]
   }
   
   return eq
}

// Formats an addition expression to separate fractions.
formatAdd[eq] :=
{
   size = getChildCount[eq]
   parts = new array
   for i=0 to size-1
   {
      if i > 0
         parts.push["+"]
      
      parts.push[formatExpression[getChild[eq,i]]]
   }

   return formatTable[[parts]]
}

// Formats a multiplication expression.
formatMultiply[eq] :=
{
   size = getChildCount[eq]
   parts = new array
   for i=0 to size-1
      parts.push[formatExpression[getChild[eq,i]]]

   return formatTable[[parts]]
}

// Formats a power expression.
formatPower[eq] :=
{
   base = getChild[eq,0]
   exp  = getChild[eq,1]
   seperate = false

   baseF = formatExpression[base]
   bp = getOperatorPrecedence[base]
   if bp != undef and bp < getOperatorPrecedence[eq]
      baseF = formatParensCompact[baseF]

   if isInteger[exp]
      expF = toUnicodeSuperscript[exp]
   else
   {
      expF = formatExpression[exp]
      separate = true
   }
   
   ep = getOperatorPrecedence[exp]
   if ep != undef and ep < getOperatorPrecedence[eq]
      expF = formatParensCompact[expF]

   if separate
      return formatTable[[["",expF],[baseF,""]], "center", "top", "", ""]
   else
      return formatTable[[[baseF,expF]], "center", "top", "", ""]
}

// Formats a function call in mathematical notation.
formatFunctionCall[eq] :=
{
   args = new array
   for i = 1 to getChildCount[eq]-1
   {
      if i > 1
         args.push[", "]
      args.push[formatExpression[getChild[eq,i]]]
   }
   
   return formatTable[[[getChild[eq,0], formatBracketsCompact[[args]]]], "", "","", "" ]
}

// Format operator that has 2 children.
formatOperator[eq] :=
{
   return formatTable[[[formatExpression[getChild[eq,0]],
                       getOperatorSymbol[eq],
                       formatExpression[getChild[eq,1]]]], "", "", "", ""]
}


View or download formatEquation.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 19032 days, 8 hours, 14 minutes ago.