ゲームプログラマを経験し、今では携帯電話向けのミドルウェアを開発するエンジニアである俺ですが……
初めて入った会社はメインフレームと COBOL の残る某レコード会社の情報システム系関連会社だったわけで、
もう忘れてしまったけど一時期は COBOL をいじってた。
この時、その言語仕様のあまりの古さ(酷さ)に常に業を煮やし続ける毎日を送ってたわけだけど、
その中で COBOL の言語仕様でこれはアリなんじゃない?という部分もほんの数個は見つけることができたのだった。
さっき、ちょっとした拍子にその中のひとつを思い出した。
それは比較演算が人間に優しい仕様になってたことだ。
C++ では
5 == 5 == 5
の式の結果は false になる。
左側から評価されるとして、最初の 5 == 5 が真偽値 true を返すので、次は true == 5 を評価しに行って、int から bool に変換されて true == true が評価されて結果が true になるのだ……と思ったら違った、
(bool == int) の時に bool 側が int に昇格するから 1 == 5 が評価されて false になるのだ。
Java とか C# では真偽値と int の比較が不正になるのでコンパイルも通らないだろう。多分。
で、これが COBOL だと
5 = 5 = 4
は偽と評価されつつ、
5 = 5 = 5
はちゃんと真に評価されたと思う。
たしかやろうとすれば
5 = 5 = 5 = 5
とか
5 = 5 NOT= 4 = 4
とかも記述できて、人間的に優しい結果が返ってきたと思う。
これは現代の言語にあってもいいんじゃないかと思った。
比較系の演算だけでオペランドが3項以上続いた場合(演算子が2つ以上の場合)に、2項の時とは違う仕組みで構文木を作らなきゃいけない事が難しいんだろうか?
ちなみに似非 C 系言語にこれがあった場合の構文木を似非ポーランド記法で書いてみる。
n1 == n2 == n3
は
(&& (== n1 n2 ) (== n2 n3 ))
に。
n1 == n2 == n3 == n4
は
(&& (== n1 n2 ) (&& (== n2 n3 ) (== n3 n4 )))
に。
こんな感じにすればいいんだと思う。
そんなことをすると世界がどうなってしまうのかわからないけれど。
追記:
equivalency-expression : multiple-equivalency-expression
| single-equivalency-expression
multiple-equivalency-expression : sub-expression eqOp sub-expression eqOp sub-expression [ eqOp sub-expression ]*
single-equivalency-expression : sub-expression eqOp sub-expression
こんな感じのルールで multiple-equivalency-expression に対しては single-equivalency-expression と別の扱いとかしたらどうだろ?とか思ってみた。