表記法の演算子の優先順位
優先順位の決定法
新しい表記法または演算子の優先順位は,それを構成しているコンポーネントを調べて決定される.例えば+ℛは+の,演算子⊕nは⊕ の,マッピング
は⟶の優先順位に従ってグループ分けされる.ポジショニングボックスのグループ化は,一般に「基底要素」で決定される.例えば,式SubscriptBox[symb,sub]は symb に基づいてグループ分けされる.しかし,構造的なボックスによっては,囲んでいる要素のグループ化にはボックスの内容が関係しないこともある.複合オブジェクトの優先順位は以下の表に従って決まる.
ボックスのタイプ
|
動作
|
| AdjustmentBox, ErrorBox, StyleBox, SubscriptBox, SuperscriptBox, SubsuperscriptBox, UnderscriptBox, OverscriptBox, UnderoverscriptBox, TagBox | これらのボックス構造は,その内容を外部から隔離しない.つまり,このようなボックスの内容はその周りの要素のグループ分けに影響を及ぼす |
| ButtonBox, FormBox, FractionBox, FrameBox, GridBox, InterpretationBox, RowBox, RadicalBox, SqrtBox | これらのボックス構造では,その内容は外部から独立している,つまり,ボックスの内容はその周りの要素のグループ分けに影響しない |
新しい複合演算子の構成要素に対応する優先順位を作成するという設計により,表記法は直観的に理解でき,一般に矛盾のないものとなる.例として,リング〈ℛ,+ℛ,*ℛ〉に対して可能な加算と乗算の表記法を考えてみる.
Notation[a_ Subscript[ + , ℛ] b_ ⟺ RingPlus[a_, b_]]
Notation[a_ Subscript[ * , ℛ] b_ ⟺ RingTimes[a_, b_]]x Subscript[ + , ℛ] y Subscript[ * , ℛ] zFullForm @ %リング乗算演算子*ℛはリング加算演算子+ℛよりも優先順位が高い.これは*の優先順位が+より高いからである.さらに,この表記法は正しい構造を維持するために式に適切なカッコを加えるように自動的に設定される.
RingTimes[RingPlus[x, y], z]RingPlus[a, b, c]RemoveNotation[a_ Subscript[ + , ℛ] b_ ⟺ RingPlus[a_, b_]]
RemoveNotation[a_ Subscript[ * , ℛ] b_ ⟺ RingTimes[a_, b_]]
InfixNotation[Subscript[ + , ℛ], RingPlus]
InfixNotation[Subscript[ * , ℛ], RingTimes]aSubscript[ + , ℛ] bSubscript[ + , ℛ] cSubscript[ + , ℛ] d Subscript[ * , ℛ] e表記法におけるカッコ
表記法の中で,式を{},(),〈〉,[],|やその他のカッコを使って囲むと,表記法のグループ分けが変わるだけでなく,カッコが入力式の中に存在しなければならなくなることに注目することは重要である.
Notation[Subscript[(expr___), 𝕊] ⟺ Semantic[expr___]]Subscript[(a, b, c), 𝕊]//FullFormSubscript[H, 𝕊] //FullForm表記法の優先順位の変更
内容を隔離するボックス構造で演算子や式を囲むことで,その演算子や式の周りにある要素を隔離することができる(上記表を参照).このカプセル化/隔離を行うためによく用いられるボックス構造はTagBoxである.さらに,TagBoxのオプションSyntaxFormを使うと,演算子の優先順位が変えられる.これについての詳細は,後ほどセクション「複雑なパターンと高度な機能」で述べる.
ToBoxes @ ``Domain∂``Domain∂ に埋め込まれたTagBoxが必要とされることには,いくつかの理由がある.それは,スタイルとZeroWidthTimesを指定するStyleBoxを含むため,自然な前置演算子が∂をグループ分けしないようにするため,そしてカプセル化された部分に構文解析とフォーマットの規則が適用されるようにするためである.