Re: syntax extension, precedence, Notation`

*To*: mathgroup at smc.vnet.net*Subject*: [mg106475] Re: syntax extension, precedence, Notation`*From*: Richard Fateman <fateman at cs.berkeley.edu>*Date*: Thu, 14 Jan 2010 05:46:36 -0500 (EST)*References*: <201001120949.EAA15726@smc.vnet.net> <hik8s7$6j4$1@smc.vnet.net>

Jaebum Jung wrote: > You might want to try Notation package. > > In[1]:= <<Notation` > In[2]:= BetterRules[x_->y_]:=x->y^2 > In[3]:= Notation[x__/! y_ \[DoubleLongLeftRightArrow] > ReplaceAll[x__,BetterRules[y_]]] > In[4]:= (x+y)/!(x->3) > Out[4]= 9+y > I tried Jaebum's suggestion , and while a useful hint, it doesn't work. 1. line 3 is not typed in but selected from a pop-up menu. 2. After doing that, the notation CAN be defined but... 3. Jaebum's example requires all 4 extra parentheses as in In[4], which I explicitly did not want. For people who know about parsing, "/!" has too high a binding power (precedence). 4. After further correspondence with Jaebum (thanks!), I found that Jaebum could not figure out how to alter the precedence of the new operator. It was clear to me that the Notations facility would be pretty useless if you could not set the precedence somehow, so I read some more. 5. I DID figure out how to alter the precedence; (I gather) it is based on the precedence of the character that begins the new operator. Thus the default precedence of the new operator "/!" is like the operator "/". We want the precedence to be more like "/.". Too bad. There may in fact be a way of altering precedence of an arbitrary new symbol, but I don't have a week to figure out the documentation and whether tags have something to do with it. Instead I picked another new operator, "=/." , since the precedence I want is lower precedence, more like = in Mathematica. (The table of operator precedence is in tutorial/OperatorInputForms) It works. Here's what happens: start by providing input that looks like Notation[x__ =/. y__ <==> ReplaceAll[x__,BetterRules[y__]]] but can't really be fully typed in .. you have to select from a palette that pops up when you do <<Notations` (In InputForm it looks like this ....) Notation`Private`myHold[ \(\*Notation`Private`makeHeldRowBoxOfBoxes[{x}, StandardForm, None] = \(/.\*Notation`Private`makeHeldRowBoxOfBoxes[{y}, StandardForm, None]\)\) ] Anyway, one can, in this case, write a+s^2+1/s^2+z =/. s^2->t and get a+t+1/t+z compare to a+s^2+1/s^2+z /. s^2->t which produces a +1/s^2+t+z, (also compare to Jaebum's solution that requires (a+s^2+1/s^2+z) /! (s^2->t) Other problems with Notations` : so far as I can tell, typing in the alleged InputForm does not do the same work as selection from the palette. While notebooks may be nice, I like to have a simple text script that can be (for example) put in email. Also, it seems that Notation` must be explicitly loaded, but perhaps there's some trick to making this happen automatically. RJF > > On 1/12/10 3:49 AM, Richard Fateman wrote: >> Is there a neat way to create a new symbol, >> say /!. so that >> >> expression /. BetterRules[rules] >> >> could be written as >> >> expression /!. rules >> >> I do not find writing something like >> >> (expression) ~BR~ (rules) >> >> to be quite adequate, especially with the extra parentheses. >> RJF >> >> >> > >

**References**:**syntax extension***From:*Richard Fateman <fateman@cs.berkeley.edu>