由于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
与和而不是/)。
- 因此,解析部要求
DoubleLongRightArrow
是RowBox
-ed与ÿ,否则它产生语法错误
- 语法着色(在
In[4]
和In[5]
)
- 它打印怪异如果直接输入(注意大在
In[4]
和In[5]
差距)
现在,我可以用这些活,虽然这将是很好,有一些手段来化解所有的小问题。我想所有这些都归结为基本上更低级别的语法处理程序,现在不会如何对新运算符进行分组。有关如何解决这些问题的任何想法?据我所知,Cell
有许多选项可能来得方便(如CellEvaluationFunction
,ShowAutoStyles
和InputAutoReplacements
),虽然我在这里再次无能为力。
换句话说,你也希望这可以在一个独立的内核中工作,即没有前端?在这种情况下,您可能需要编写自己的'$ SyntaxHandler',这需要一个Mathematica认为有语法错误的字符串。虽然这可能是棘手的。 – Sasha 2011-04-17 21:31:05
你好Istvan!不能帮助这个,但让我欢迎你到StackOverflow!我希望这里的其他人能有一个很好的答案。 – 2011-04-17 21:38:50
嗨István,欢迎来到StackOverflow!我从belisarius借用的一条有用的欢迎消息:请允许我欢迎您来到StackOverflow,并提醒我们通常在这里做的三件事:1)当您获得帮助时,尝试在您的专业领域回答问题2)阅读常见问题解答3)当你看到好的问答时,使用灰色三角形对它们进行投票,因为系统的可信度基于用户通过分享知识获得的声誉。还请记住接受答案,如果有的话,通过按复选标记 – 2011-04-17 21:39:14