💎演算子の結合性(associativity)

演算子の結合性(associativity)は、式中で同じ優先度の演算子が連続して出現した場合に、どの順序で評価されるべきかを指定する属性です。結合性は主に「左結合性」や「右結合性」として知られています。

  1. 左結合性 (Left Associativity)

    • 演算子が左結合性を持つ場合、同じ優先度の演算子が連続して現れた時、左から右の順序で評価されます。

    • 例: 通常の算術演算子(加算、減算、乗算、除算など)は左結合性を持ちます。このため、3 - 2 - 1(3 - 2) - 1 として評価されます。

  2. 右結合性 (Right Associativity)

    • 演算子が右結合性を持つ場合、同じ優先度の演算子が連続して現れた時、右から左の順序で評価されます。

    • 例: 代入演算子やべき乗演算子は、多くのプログラミング言語で右結合性を持っています。例えば、a = b = ca = (b = c) として評価され、2^3^2(もし ^ がべき乗を示す場合)は 2^(3^2) として評価されることが多いです。

ラムダ計算や関数型プログラミングにおいて、関数の適用は、通常、左結合性を持つとされます。例えば、f x y(f x) y として解釈されます。この関数の適用の結合性は、コンビネータの動作やその評価戦略と関係があります。

C++の演算子オーバーロードでは、演算子の結合性はオーバーロードによって変更されることはありません。結合性はその演算子のもともとの結合性に従います。つまり、オーバーロードすることで演算子の動作(処理の内容)をカスタマイズできますが、結合性や優先順位を変更することはできません。

たとえば、+ 演算子は左から右への結合性を持ちます。これは、+ 演算子をオーバーロードしても変わりません。

一部のプログラミング言語や環境では、柔軟性の観点からこのような機能を提供していることがあります。

  • Haskell: Haskellでは、独自の中置演算子を定義することができます。さらに、infix, infixl, infixr ディレクティブを使用して、その演算子の結合性と優先順位を指定することができます。infixlは左結合、infixrは右結合を意味します。

J言語は、APLにインスパイアされた配列プログラミング言語です。J言語における"演算子"は、ほかの言語の関数や演算子とは少し違った概念を持ちます。Jには、動詞(関数)、名詞(データ)、接続詞(結合する演算)、アドバーブ(動詞や接続詞を変更するもの)など、独自のタームセットがあります。

Jの動詞は、ほかの言語でいう関数や演算子に相当しますが、結合性は基本的に右結合です。これは、動詞のチェーンが右から左に評価されることを意味します。


LISP(特にCommon LispやSchemeなどの主流の方言)における"演算子"や"関数"は、他の多くの言語とは異なり、前置記法を使用しています。前置記法では、関数や演算子がその引数よりも前に来ます。これは、伝統的な中置記法の演算子の結合性の問題とは異なります。

Prologでは、演算子の定義や再定義をサポートしており、演算子の結合性や優先順位を指定することができます。op/3 という組み込み述語を使用して、演算子の優先順位、結合性、および名前を定義します。

op/3 の3つの引数は以下の通りです:

  1. 優先順位(0から1200の整数)

  2. 結合性(fx, fy, xf, yf, xfx, xfy, yfx のいずれか)

  3. 演算子の名前(アトム)


いいなと思ったら応援しよう!

あたり帳簿
お願い致します