我想定义一个x /==> y
形式的新运算符,其中
运营商/==>
被视为例如/@
的{{1}}运算符,和
被翻译为Map
。有一个重要方面:我
希望生成的运算符像任何两位一样在前端中运行
运算符,即两个字符(MyFunction[x, y]
和a
Divide
)应该连接在一起,没有语法
应该出现着色,并且它们将在一起选择
单击,因此必须设置优先级。另外,我宁愿避免使用
DoubleLongRightArrow
包。结果,我想看到这样的事情:
Notation`
有没有人知道如何实现这个目标?
答案 0 :(得分:6)
Notation Package可能是最接近做这种事情的,但根据对my own question of a similar nature的回应,遗憾的是,你想要的并不实际。
不要让这阻止你尝试,因为你可能会在这个过程中学到新的东西。 Notation Package及其支持的功能远非无用。
您还可以找到对this question提供信息的回复。
有许多函数可用于手动实现语法更改。我将引导您访问这些函数的官方页面,而不是尝试编写我自己的帮助文件。阅读完毕后,请询问您的任何重点问题,或者获取实施具体想法的帮助。我或其他人应该能够回答你的问题,告诉你如何做某事,或解释为什么不可能。
Textual Input and Output上的索引页。
更为彻底的是,可以使用CellEvaluationFunction
来unusual things进行操作。
还有更多,我稍后会尝试扩展此列表。 (欢迎其他人编辑此帖)
答案 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]\)
为了清楚起见,这里也是一个截图:
由于运营商未完全整合,因此需要进一步关注:
DoubleLongRightArrow
y 而不是/)。DoubleLongRightArrow
为RowBox
- 用 y 编辑,否则会产生语法错误In[4]
和In[5]
)In[4]
和In[5]
处的大差距)现在,我可以忍受这些,尽管有一些方法来解决所有的小问题会很好。我想所有这些都归结为基本上一些甚至更低级别的语法处理程序,现在它还没有如何对新运算符进行分组。有关如何解决这些问题的任何想法?我了解Cell
有多种选项可能会派上用场(例如CellEvaluationFunction
,ShowAutoStyles
和InputAutoReplacements
),尽管我在这里再次无能为力。