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 19030 days, 13 hours, 51 minutes ago.