1919from mathics .core .list import ListExpression
2020from mathics .core .number import dps
2121from 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+ )
2330from 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