某解説動画を作っていたら,代入に「=」を使うとエラーになる部分があった。
てっきり「代入の定義から間違って削っちゃったかな」と思って「←」に変更してやり過ごしたのだが,
調べてみるとそういう事実はない。
エラーになるのは「a=9個の0」というように「〜個の〜」を使っているところで,
結局「〜個の〜」を演算子扱いしていることにより,
「=」の結合規則(nonassoc)の影響を受けてしまったということらしい。
「←」は演算子扱いしていないのでその影響は受けない。
「=」などの比較演算子をnonassocにしているのは,
たとえば「a==b==c」が「a==(b==c)」と解釈されて,
「エラーにならないけど思ったのと違う挙動をする(Cっぽい感じ)」ことを避けて「エラーにする」ためだ。
しかしPythonでは「a<b<c」のような比較が認められているのだから,
それに合わせて「a==b==c」を「a==bかつb==c」というように解釈するのも一つの解決になる。
そういう感じの比較クラスを作ってしまえば解決するような気がするのだが,
どうしたものか。
DNCL2ではこのあたりどういう扱いになるんだろう。
そもそもは「=」が代入にも比較にも使えるとしてしまったことに原因があるので,
比較は「==」でないとダメ,とするのもまた一つの解決になる。
でもそれだとDNCL2と挙動が違ってしまう。
もう一つ解決方法があって,
「=」などの比較演算子よりも「〜個の〜」の優先順位を上げて,
「a=4個のx=y」のような比較演算を使うときは「a=4個の(x=y)」というようにカッコを強制するというものだ。
それなりに悪くない気はするが,「a=4個の1+2」にはカッコがいらないのだからちょっと気分が悪い。