2011-04-17 79 views
7

我想定义一个新运算符的形式x /==> y,其中 运算符/==>被视为例如。 Map和 的/@运营商被翻译为MyFunction[x, y]。还有一个重要的方面:我 希望造成运营商在前端表现得像任何两个位 运营商呢,也就是两个字符(一个DivideDoubleLongRightArrow)应连接在一起,没有语法 着色应出现,并且在点击 时要一起选择它们,因此必须设置优先级。另外,我宁愿避免使用包装。因此,我想看到这样的事情:如何定义类似运算符

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

Out[11]//FullForm= MyFunction[x,y] 

有没有人有一个想法如何实现这一目标?

+1

换句话说,你也希望这可以在一个独立的内核中工作,即没有前端?在这种情况下,您可能需要编写自己的'$ SyntaxHandler',这需要一个Mathematica认为有语法错误的字符串。虽然这可能是棘手的。 – Sasha 2011-04-17 21:31:05

+1

你好Istvan!不能帮助这个,但让我欢迎你到StackOverflow!我希望这里的其他人能有一个很好的答案。 – 2011-04-17 21:38:50

+1

嗨István,欢迎来到StackOverflow!我从belisarius借用的一条有用的欢迎消息:请允许我欢迎您来到StackOverflow,并提醒我们通常在这里做的三件事:1)当您获得帮助时,尝试在您的专业领域回答问题2)阅读常见问题解答3)当你看到好的问答时,使用灰色三角形对它们进行投票,因为系统的可信度基于用户通过分享知识获得的声誉。还请记住接受答案,如果有的话,通过按复选标记 – 2011-04-17 21:39:14

回答

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而不是/)。
  • 因此,解析部要求DoubleLongRightArrowRowBox -ed与ÿ,否则它产生语法错误
  • 语法着色(在In[4]In[5]
  • 它打印怪异如果直接输入(注意大在In[4]In[5]差距)

现在,我可以用这些活,虽然这将是很好,有一些手段来化解所有的小问题。我想所有这些都归结为基本上更低级别的语法处理程序,现在不会如何对新运算符进行分组。有关如何解决这些问题的任何想法?据我所知,Cell有许多选项可能来得方便(如CellEvaluationFunction,ShowAutoStylesInputAutoReplacements),虽然我在这里再次无能为力。

+0

我忘记了ShowAutoStyles。我将不得不考虑如何使用它。根据我对Wolfram Research公司工作的迈克尔皮拉特的回答,我仍然怀疑你想要的不是完全可能的。尽管如此,也许可以伪造你请求的一个或多个附加行为点。 – 2011-04-19 15:35:33

6

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

不要让这阻止你尝试,因为你可能会在过程中学到新东西。符号包和支撑它的功能远没有用处。

您也可能会找到对this question信息的回复。


有许多功能对手动执行语法更改很有用。我不会尝试为这些写自己的帮助文件,而是引导您访问这些功能的官方页面。阅读完它们之后,请询问您的任何重点问题,或寻求具体建议的帮助。我或其他人应该能够回答你的问题,告诉你如何去做,或者解释为什么不可能。

还有更多,我会尽量延长这个名单。 (别人欢迎编辑这篇文章

+0

@IstvánZachar,具体来说,你会想看看这个'Notation' [教程](http://reference.wolfram.com/mathematica/Notation/tutorial/NotationSymbolizeAndInfixNotation.html),因为它基本上讨论了你想要的尽管三个运营商的组合可能会导致您的问题。 – rcollyer 2011-04-18 12:32:55

+0

感谢您使用Notation包装上的提示,但这对我来说就像是一个黑匣子。我不知道内部会发生什么(我真的不想对其进行逆向工程),也不能根据需要对其进行修改或进一步开发。这就是为什么如果可能的话,我会选择基本的Mathematica基础。如果不是,那么我完全避免使用多字符操作符。 – 2011-04-18 22:04:50

+0

@IstvánZachar,我不认为即使Notation包也能做你想做的事情,所以如果你没有得到满足你的要求的答案,请不要失望。几分钟后,我会更新自己的答案,并提供一些关于手动语法操作的更多想法。 – 2011-04-18 22:49:53