如何定义/ @ - like运算符

Ist*_*har 7 syntax wolfram-mathematica operators

我想定义一个表单的新运算符x /==> y,其中运算符/==>被视为例如/@运算符Map,并被转换为MyFunction[x, y].有一个重要的方面:我希望结果运算符像任何两位运算符一样在前端运行,也就是说,两个字符(a Divide和a DoubleLongRightArrow)应该连接在一起,不应出现语法着色,它们是单击时可以一起选择,因此必须设置优先级.另外,我宁愿避免使用该 Notation`包.结果,我想看到这样的事情:

In[11]:= FullForm[x/\[DoubleLongRightArrow]y]

Out[11]//FullForm= MyFunction[x,y]
Run Code Online (Sandbox Code Playgroud)

有谁知道如何实现这一目标?

Mr.*_*ard 6

符号包可能是最接近于做这样的事情,而是根据响应我自己的类似性质的问题,你想要的是不幸的是不实际的.

不要让这阻止你尝试,因为你可能会在这个过程中学到新东西.Notation Package及其支持的功能远非无用.

您也可以找到对此问题的回复提供信息.


有许多函数可用于手动实现语法更改.我将引导您访问这些函数的官方页面,而不是尝试编写我自己的帮助文件.阅读完毕后,请询问您的任何重点问题,或者获取实施具体想法的帮助.我或其他人应该能够回答你的问题,告诉你如何做某事,或解释为什么不可能.

还有更多,我稍后会尝试扩展此列表.(欢迎其他人编辑此帖子)


Ist*_*har 2

感谢 Mr.Wizard 的链接,我在文档中找到了有关如何解析新运算符的唯一示例(低级输入中的 gplus 示例)。根据这个例子,这是我的新运算符的版本PerArrow。请对以下代码发表评论/批评:

In[1]:= PerArrow /: MakeBoxes[PerArrow[x_, y_], StandardForm] := 
  RowBox[{MakeBoxes[x, StandardForm], 
    RowBox[{AdjustmentBox["/", BoxMargins -> -.2], 
      AdjustmentBox["\[DoubleLongRightArrow]", BoxMargins -> -.1]}], 
    MakeBoxes[y, StandardForm]}];

MakeExpression[
   RowBox[{x_, "/", RowBox[{"\[DoubleLongRightArrow]", y_}]}], 
   StandardForm] := 
  MakeExpression[RowBox[{"PerArrow", "[", x, ",", y, "]"}], 
   StandardForm];

In[3]:= PerArrow[x, y]

Out[3]= x /\[DoubleLongRightArrow] y

In[4]:= x /\[DoubleLongRightArrow]y

Out[4]= x /\[DoubleLongRightArrow] y

In[5]:= FullForm[x /\[DoubleLongRightArrow]y]

Out[5]//FullForm= \!\(\*
TagBox[
StyleBox[
RowBox[{"PerArrow", "[", 
RowBox[{"x", ",", "y"}], "]"}],
ShowSpecialCharacters->False,
ShowStringCharacters->True,
NumberMarks->True],
FullForm]\)
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,这里还提供了一个屏幕截图: 新操作员

由于运营商尚未完全集成,进一步的担忧是:

  • 单击时操作符的选择很奇怪(DoubleLongRightArrowy而不是 /)。
  • 因此,解析部分需要使用yDoubleLongRightArrow进行RowBox编辑,否则会产生语法错误
  • 语法着色(atIn[4]In[5]
  • In[4]如果直接输入,它会打印得很奇怪(注意和处的大间隙In[5]

现在,我可以忍受这些,不过如果能有一些方法来解决所有的小问题就好了。我想所有这些基本上都归结为一些更低级别的语法处理程序,它现在不知道如何对新运算符进行分组。关于如何解决这些问题有什么想法吗?我知道Cell有很多可能会派上用场的选项(例如CellEvaluationFunctionShowAutoStylesInputAutoReplacements),尽管我在这里再次一无所知。