【问题标题】:How to define /@-like operator如何定义 /@-like 运算符
【发布时间】:2011-04-17 20:40:26
【问题描述】:

我想定义一个x /==> y 形式的新运算符,其中 运算符/==> 被视为例如Map/@ 运算符,以及 被翻译成MyFunction[x, y]。有一个重要方面:我 希望得到的运算符在前端表现得像任何两位 操作符,即两个字符(DivideDoubleLongRightArrow) 应该连在一起,没有语法 应该出现着色,并且当它们被一起选择时 点击,所以必须设置优先级。另外,我宁愿避免使用 Notation` 包。因此,我希望看到这样的内容:

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

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

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

【问题讨论】:

  • 换句话说,您还希望它在独立内核中工作,即没有前端?在这种情况下,您可能想要编写自己的 $SyntaxHandler,这将采用 Mathematica 认为存在语法错误的字符串。不过,这可能很棘手。
  • 您好伊斯特万!不能帮助这个,但让我欢迎你来到 StackOverflow!我希望这里的其他人能有一个好的答案。
  • 嗨,István,欢迎来到 StackOverflow!我从 belisarius 那里借用了一条有用的欢迎信息:请允许我欢迎您使用 StackOverflow,并提醒我们通常在这里做的三件事:1)当您获得帮助时,请尝试回答您专业领域的问题 2)阅读常见问题3)当你看到好的问答时,用灰色三角形给他们投票,因为系统的可信度是基于用户通过分享他们的知识而获得的声誉。还记得通过按复选标记来接受可以更好地解决您的问题的答案(如果有)
  • 谢谢,会努力为社区和信誉而成长。

标签: syntax wolfram-mathematica operators


【解决方案1】:

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

但是,不要让这阻止您尝试,因为您可能会在此过程中学到新东西。 Notation 包和支持它的功能远非无用。

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


有许多函数可用于手动执行语法更改。我不会尝试为这些功能编写自己的帮助文件,而是将您引导至有关这些功能的官方页面。阅读它们后,请提出您有的任何重点问题,或寻求实施具体想法的帮助。我或这里的其他人应该能够回答您的问题,向您展示如何做某事,或者解释为什么这不可能。

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

【讨论】:

  • @István Zachar,具体来说,你会想看看这个Notation tutorial,因为它基本上讨论了你想要做什么,尽管三个运算符的组合可能会给你带来问题。
  • 感谢 Notation 包的提示,但这对我来说就像一个黑匣子。我既不知道内部发生了什么(我真的不想对其进行逆向工程),也无法根据自己的需要对其进行修改或进一步开发。这就是为什么如果可能的话,我会使用简单的 Mathematica 基础知识。如果没有,那么我完全避免使用多字符运算符。
  • @István Zachar,我认为即使是 Notation 包也不能满足您的要求,所以如果您没有得到满足您要求的答案,请不要失望。几分钟后,我将通过一些关于手动语法操作的进一步想法来更新我的答案。
【解决方案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 而不是 /)。
  • 因此,解析部分要求DoubleLongRightArrowRowBox-ed y,否则会产生语法错误
  • 语法着色(In[4]In[5]
  • 如果直接输入,打印出来的效果很奇怪(注意In[4]In[5] 处的大间隙)

现在,我可以忍受这些,但如果能有办法解决所有小问题,那就太好了。我想所有这些基本上都归结为一些甚至更低级别的语法处理程序,它现在不知道如何对 new 运算符进行分组。关于如何解决这些问题的任何想法?我知道Cell 有许多可能派上用场的选项(例如CellEvaluationFunctionShowAutoStylesInputAutoReplacements),尽管我在这里又一无所知。

【讨论】:

  • 我忘记了 ShowAutoStyles。我将不得不考虑如何使用它。根据我从 Wolfram Research 工作的 Michael Pilat 对我自己的问题的回答,我仍然怀疑你想要的不是完全可能的。不过,您可能会伪造您要求的一个或多个附加行为点。
猜你喜欢
  • 2015-04-10
  • 1970-01-01
  • 2018-12-13
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多