FoxySheep
FoxySheep copied to clipboard
Differentiating between ReplaceAll and Division (Times [ , Power])
In https://github.com/mathics/Mathics/issues/989 it was noticed that 1/.2 Is comes out ReplaceAll[1,2] rather than Times[1,Power[.2,-1]].
The fix there was to add a lookahead pattern for a number to distinguish these.
ANTLR4 has such a notion too which I think is called a semantic predicate or {...}? which might help the parser here.
The rules for how . is parsed are arcane. Here are my private notes on the subject from last summer:
1//..9 is ReplaceRepeated[1, 0.9`]
1//.9 is ReplaceRepeated[1, 9] should be 0.9[1]
1/.9 is Times[1, Power[0.9`, -1]]
1...9 is 9 ((1)...) or Hold[Times[RepeatedNull[1], 9]]
7//.9 is ReplaceRepeated[7, 9]
7// .9 is 0.9`[7]
1/.1->2 is 10. -> 2
7// .9 is 0.9`[7]
b; 7`b is 7. b
_.1 is Times[Optional[Blank[]], 1]
Rule: If . can be interpreted as part of an operator, it will be. The only exceptions are:
b=.1
a/:b=.1
a/.1
a.b (* The Dot operator. *)
This places the precedence of the decimal point between //. and /.—excepting for the Dot operator itself.
Pingback to #2 for reference, which references the edge case x_.. discussed here.