whole_func_string: function getNumericValue(expr) {
      var simplified = simplifyConstant(expr);
      return toNumber(simplified);
  
      function toNumber(expr) {
        if(expr.type === 'OperatorNode' && expr.op === '-' && expr.args.length === 1) {
          // Unary minus
          var num = toNumber(expr.args[0]);
          return num === undefined ? undefined : -num;
        } else if(expr.type === 'ConstantNode' && (!expr.valueType || expr.valueType === 'number')) {
          return +expr.value;
        } else {
          return undefined;
        }
      }
    }
func_code_string: function getNumericValue(expr) {
      var simplified = simplifyConstant(expr);
      return toNumber(simplified);
  
      function toNumber(expr) {
        if(expr.type === 'OperatorNode' && expr.op === '-' && expr.args.length === 1) {
          // Unary minus
          var num = toNumber(expr.args[0]);
          return num === undefined ? undefined : -num;
        } else if(expr.type === 'ConstantNode' && (!expr.valueType || expr.valueType === 'number')) {
          return +expr.value;
        } else {
          return undefined;
        }
      }
    }
func_documentation_string: Gets the numerical value of the given node if possible, othewise returns undefined.
  TODO: does this work with BigNumber / Fractions / etc.