Subject | : 演算子の定義に付いて |
Article No | : 599 |
Date | : 2008/05/10(Sat) 23:27:31 |
Contributor | : Akio Morita |
SADの演算子の作用とその優先順位を調べているのですが、 謎が多いで調査結果をさらしてみます
ソースが仕様だと言われても、 o 関数表現で入力した式の出力として得られる演算子表記が再入力できない、 若しくは再入力時の解釈結果が元と同値でない つまり、(ToExpression[ToString[#]] === #)&が Trueでない o 入力式によっては、Damaged Buffer/Segmentation fault状態になるので 任意の入力式の構文が正しい/間違っているの判別が出来ない という問題があります。(構文の正誤とその構文が意味を持つ(実行可能)かは別問題です)
1. 暗黙の積演算子と単項+/-演算子の優先順位 「SAD/Tkinterの使い方」のp.61〜63を読む限り演算子を中置しない暗黙の積表現 (a b c) -> Times[a, b, c]よりも単項の +/-演算子の優先順位が高いので、 表27の演算子優先順位を厳格に適用すると式"(a +b -c)"は一般的な期待に反して Plus[a, b, Times[-1, c]]では無く Times[a, b, Times[c]]と解釈されるのが正しいと思われます
直感に従う文法にするには、「単項+/-演算子と結合した項は暗黙の積演算子のオペランドに 成れない」という文脈依存性を文法に追加する必要が有ります。逆に、演算子のオペランドには 文脈依存性無く、全て等価に扱うのであれば、現行の実装は表27の演算子優先順位を正しく 反映していません
2. @演算子 表26によれば、@演算子を使った式 "a@b"は a[b]と等価であり、グループ化の欄を見る限り 右結合な演算子のようですが、実際の動作は異なります。
bが Real/Stringの場合は a@b -> a[b]と変換されますが、 bが Symbolの場合には a@b -> Member[a,b]と変換されます。
従って、右結合を期待して Log[Exp[10]]を Log@Exp@10と短縮記述すると Member[Log, Exp][10]と変換され期待した動作になりません # つまり、構文解析上は、左結合で解決される
根本的な原因は、Classの導入時に Member[]関数の演算子表現に @を採用し その結合規則が元の @と異なる左結合であるためと考えられます。 # 結合則が同じならオペランドによって動作を変えるという意味論レベルの修正で # 問題なかったと思うのですが...
あと、Member演算子としての @演算子の優先順位はどの位置なのでしょう?
3. バッククォート ` init.n内部やスーパークラスを参照するときに使う バッククォート ` ですが、 演算子として作用しているようですが、結合則と優先順位はどうなっているのでしょう?
|