如何定义/ @ - like运算符

时间:2011-04-17 20:40:26

标签: syntax wolfram-mathematica operators

我想定义一个x /==> y形式的新运算符,其中 运营商/==>被视为例如/@的{​​{1}}运算符,和 被翻译为Map。有一个重要方面:我 希望生成的运算符像任何两位一样在前端中运行 运算符,即两个字符(MyFunction[x, y]和a Divide)应该连接在一起,没有语法 应该出现着色,并且它们将在一起选择 单击,因此必须设置优先级。另外,我宁愿避免使用 DoubleLongRightArrow包。结果,我想看到这样的事情:

Notation`

有没有人知道如何实现这个目标?

2 个答案:

答案 0 :(得分:6)

Notation Package可能是最接近做这种事情的,但根据对my own question of a similar nature的回应,遗憾的是,你想要的并不实际。

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

您还可以找到对this question提供信息的回复。


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

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

答案 1 :(得分:2)

感谢Mr.Wizard的链接,我在文档中找到了关于如何解析新运算符(gplus example in Low-Level Input)的唯一示例。根据此示例,这是我的新运算符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]\)

为了清楚起见,这里也是一个截图: new operator

由于运营商未完全整合,因此需要进一步关注:

  • 单击时选择的运算符很奇怪(DoubleLongRightArrow y 而不是/)。
  • 因此,解析部分要求DoubleLongRightArrowRowBox - 用 y 编辑,否则会产生语法错误
  • 语法着色(In[4]In[5]
  • 如果直接输入则会打印出奇怪的声音(注意In[4]In[5]处的大差距)

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