10

There are some invisible operators in Mathematica (\[ImplicitPlus],\[InvisibleTimes],\[InvisibleComma],\[InvisibleApplication]). How can I make my own that would not interfere with built-in functions (Plus,Times,Sequence,Apply)? Is there some invisible character like those different kinds of spaces (\[RawSpace],\[ThinSpace],\[VeryThinSpace], etc.) that won't be interpreted as multiplication, so that I can define my own patterns and behaviour with it?

EDIT: OK, I think this is it:

TemplateBox[{}, "op",
  InterpretationFunction :> (RowBox@{"~op~"} &), 
  DisplayFunction :> (RowBox@{"\[InvisibleSpace]"} &)];
SetOptions[EvaluationNotebook[], InputAliases -> {"op" -> %}]
SetAttributes[op, Flat];

Now if I type 1[ESC]op[ESC]2[ESC]op[ESC]3 it will be interpreted as 1~op~2~op~3 which means op[1,2,3] if op has Flat attribute, but will be displayed as 123.

I wonder why nobody came up with it, what all the gurus doing?

Whatever, now I can finally create pretty EDSLs in Mathematica :D

swish
  • 7,881
  • 26
  • 48

1 Answers1

5

I can't provide working code because I don't have access to Mathematica now, but you can do this using MakeExpression. You can reverse engineer the required box structure by typing the InfixForm of Times[x,y] in an Input Cell. Select the input cell, and press Shift-Ctrl-E to see the underlying box structure for infix multiplication. You want the same structure, except with the operator you want.

You can probably get examples if you search for MakeExpression, MakeBoxes at MathGroup.

Ted Ersek
  • 7,124
  • 19
  • 41