예제 #1
0
class Dispatch(Atom):
    def __init__(self, rulelist, evaluation):
        self.src = Expression(SymbolList, *rulelist)
        self.rules = [
            Rule(rule._leaves[0], rule._leaves[1]) for rule in rulelist
        ]
        self._leaves = None
        self._head = Symbol("Dispatch")

    def get_sort_key(self):
        return self.src.get_sort_key()

    def get_atom_name(self):
        return "System`Dispatch"

    def __repr__(self):
        return "dispatch"

    def atom_to_boxes(self, f, evaluation):
        leaves = self.src.format(evaluation, f.get_name())
        return Expression(
            "RowBox",
            Expression(SymbolList, String("Dispatch"), String("["), leaves,
                       String("]")),
        )
예제 #2
0
    def apply_makeboxes(self, x, x0, data, nmin, nmax, den, form, evaluation):
        """MakeBoxes[SeriesData[x_, x0_, data_List, nmin_Integer, nmax_Integer, den_Integer], form_Symbol]"""

        form = form.get_name()
        if x0.is_zero:
            variable = x
        else:
            variable = Expression(
                SymbolPlus, x, Expression(SymbolTimes, IntegerMinusOne, x0)
            )
        den = den.get_int_value()
        nmin = nmin.get_int_value()
        nmax = nmax.get_int_value() + 1
        if den != 1:
            powers = [Rational(i, den) for i in range(nmin, nmax)]
            powers = powers + [Rational(nmax, den)]
        else:
            powers = [Integer(i) for i in range(nmin, nmax)]
            powers = powers + [Integer(nmax)]

        expansion = []
        for i, leaf in enumerate(data.leaves):
            if leaf.is_numeric() and leaf.is_zero:
                continue
            if powers[i].is_zero:
                expansion.append(leaf)
                continue
            if powers[i] == Integer1:
                if leaf == Integer1:
                    term = variable
                else:
                    term = Expression(SymbolTimes, leaf, variable)
            else:
                if leaf == Integer1:
                    term = Expression(SymbolPower, variable, powers[i])
                else:
                    term = Expression(
                        SymbolTimes, leaf, Expression(SymbolPower, variable, powers[i])
                    )
            expansion.append(term)
        expansion = expansion + [
            Expression(SymbolPower, Expression("O", variable), powers[-1])
        ]
        # expansion = [ex.format(form) for ex in expansion]
        expansion = Expression(SymbolPlus, *expansion)
        return expansion.format(evaluation, form)
예제 #3
0
def format_output(obj, expr, format=None):
    """
    Handle unformatted output using the *specific* capabilities of mathics-django.

    evaluation.py format_output() from which this was derived is similar but
    it can't make use of a front-ends specific capabilities.
    """
    def eval_boxes(result, fn, obj, **options):
        try:
            boxes = fn(evaluation=obj, **options)
            # print("XXX\n", boxes)
        except BoxError:
            boxes = None
            if not hasattr(obj, "seen_box_error"):
                obj.seen_box_error = True
                obj.message("General", "notboxes",
                            Expression("FullForm", result).evaluate(obj))

        return boxes

    if format is None:
        format = obj.format

    if isinstance(format, dict):
        return dict((k, obj.format_output(expr, f)) for k, f in format.items())

    # For some expressions, we want formatting to be different.
    # In particular for FullForm output, we dont' want MathML, we want
    # plain-ol' text so we can cut and paste that.

    expr_type = expr.get_head_name()
    if expr_type in ("System`MathMLForm", "System`TeXForm"):
        # For these forms, we strip off the outer "Form" part
        format = FORM_TO_FORMAT[expr_type]
        leaves = expr.get_leaves()
        if len(leaves) == 1:
            expr = leaves[0]

    if expr_type in ("System`FullForm", "System`OutputForm"):
        result = Expression("StandardForm", expr).format(obj, expr_type)
        return str(result)
    elif expr_type == "System`Graphics":
        result = Expression("StandardForm",
                            expr).format(obj, "System`MathMLForm")

    # This part was derived from and the same as evaluation.py format_output.

    use_quotes = get_settings_value(obj.definitions, "Settings`$QuotedStrings")

    if format == "text":
        result = expr.format(obj, "System`OutputForm")
        result = eval_boxes(result, result.boxes_to_text, obj)

        if use_quotes:
            result = '"' + result + '"'

        return result
    elif format == "xml":
        result = Expression("StandardForm",
                            expr).format(obj, "System`MathMLForm")
    elif format == "tex":
        result = Expression("StandardForm", expr).format(obj, "System`TeXForm")
    elif format == "unformatted":
        # This part is custom to mathics-django:
        if str(expr) == "-Graph-" and hasattr(expr, "G"):
            return format_graph(expr.G)
        head = str(expr.get_head())
        if head == "System`CompiledFunction":
            result = expr.format(obj, "System`OutputForm")
        elif head == "System`String":
            result = expr.format(obj, "System`InputForm")
            result = result.boxes_to_text(result)

            if not use_quotes:
                # Substring without the quotes
                result = result[1:-1]

            return result
        elif head == "System`Graphics3D":
            form_expr = Expression("StandardForm", expr)
            result = form_expr.format(obj, "System`StandardForm")
            return eval_boxes(result, result.boxes_to_js, obj)
        elif head == "System`Graphics":
            form_expr = Expression("StandardForm", expr)
            result = form_expr.format(obj, "System`StandardForm")
            return eval_boxes(result, result.boxes_to_svg, obj)
        else:
            result = Expression("StandardForm",
                                expr).format(obj, "System`MathMLForm")
    else:
        raise ValueError

    if result is None:
        return f"Error in evaluating {expr}"
    return eval_boxes(result, result.boxes_to_text, obj)