Skip to content

Commit e3b033a

Browse files
committed
fix MakeBoxes[Infix[...]]
1 parent f984e8d commit e3b033a

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

mathics/builtin/layout.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ class Infix(Builtin):
146146

147147
messages = {
148148
"normal": "Nonatomic expression expected at position `1`",
149+
"intm": "Machine-sized integer expected at position 3 in `1`",
149150
}
150151
summary_text = "infix form"
151152

mathics/builtin/makeboxes.py

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,14 @@
1919
from mathics.core.list import ListExpression
2020
from mathics.core.number import dps
2121
from mathics.core.symbols import Atom, Symbol
22-
from mathics.core.systemsymbols import SymbolInputForm, SymbolOutputForm, SymbolRowBox
22+
from mathics.core.systemsymbols import (
23+
SymbolFullForm,
24+
SymbolInfix,
25+
SymbolInputForm,
26+
SymbolNone,
27+
SymbolOutputForm,
28+
SymbolRowBox,
29+
)
2330
from mathics.eval.makeboxes import _boxed_string, format_element
2431

2532

@@ -455,12 +462,33 @@ def eval_postprefix(self, p, expr, h, prec, f, evaluation):
455462
# And this is recent with respect to PredefinedSymbol revision.
456463
# How does this get set and why?
457464
def eval_infix(
458-
self, expr, operator, prec: Integer, grouping, form: Symbol, evaluation
465+
self, expr, operator, precedence: Integer, grouping, form: Symbol, evaluation
459466
):
460-
"""MakeBoxes[Infix[expr_, operator_, prec_:None, grouping_:None],
467+
"""MakeBoxes[Infix[expr_, operator_, precedence_:None, grouping_:None],
461468
form:StandardForm|TraditionalForm|OutputForm|InputForm]"""
462469

463-
assert isinstance(prec, Integer)
470+
# In WMA, this is covered with two different rules:
471+
# * ```MakeBoxes[Infix[expr_, operator_]```
472+
# * ```MakeBoxes[Infix[expr_, operator_, precedence_, grouping_:None]```
473+
# In the second form, precedence must be an Integer. Otherwise, a message is
474+
# shown and fall back to the standard MakeBoxes form.
475+
# Here we allow Precedence to be ```System`None```, to have just one rule.
476+
477+
if precedence is SymbolNone:
478+
precedence_value = None
479+
elif isinstance(precedence, Integer):
480+
precedence_value = precedence.value
481+
else:
482+
if grouping is not SymbolNone:
483+
# Here I use a String as a head to avoid a circular evaluation.
484+
# TODO: Use SymbolInfix when the MakeBoxes refactor be done.
485+
expr = Expression(String("Infix"), expr, operator, precedence, grouping)
486+
else:
487+
expr = Expression(String("Infix"), expr, operator, precedence)
488+
evaluation.message("Infix", "intm", expr)
489+
return self.eval_general(expr, form, evaluation)
490+
491+
grouping = grouping.get_name()
464492

465493
## FIXME: this should go into a some formatter.
466494
def format_operator(operator) -> Union[String, BaseElement]:
@@ -490,9 +518,6 @@ def format_operator(operator) -> Union[String, BaseElement]:
490518
return op
491519
return operator
492520

493-
precedence = prec.value
494-
grouping = grouping.get_name()
495-
496521
if isinstance(expr, Atom):
497522
evaluation.message("Infix", "normal", Integer1)
498523
return None
@@ -501,7 +526,9 @@ def format_operator(operator) -> Union[String, BaseElement]:
501526
if len(elements) > 1:
502527
if operator.has_form("List", len(elements) - 1):
503528
operator = [format_operator(op) for op in operator.elements]
504-
return make_boxes_infix(elements, operator, precedence, grouping, form)
529+
return make_boxes_infix(
530+
elements, operator, precedence_value, grouping, form
531+
)
505532
else:
506533
encoding_rule = evaluation.definitions.get_ownvalue(
507534
"$CharacterEncoding"
@@ -523,7 +550,9 @@ def format_operator(operator) -> Union[String, BaseElement]:
523550
String(operator_to_unicode.get(op_str, op_str))
524551
)
525552

526-
return make_boxes_infix(elements, operator, precedence, grouping, form)
553+
return make_boxes_infix(
554+
elements, operator, precedence_value, grouping, form
555+
)
527556

528557
elif len(elements) == 1:
529558
return MakeBoxes(elements[0], form)

0 commit comments

Comments
 (0)