年寄るまで意味論を拝まざりければ
三項演算子
コーディングスタイル(R.Tanaka.Ichiro's Blog)を読んでいて思ったことがあります。
三項演算子を禁止している案件で仕事したことのほうが多いです。
たしか、MISRA-Cで禁止してたような気がします。
禁止していないところは「誰も使わないから制限対象にしない」という理由で禁止していません。ちなみに自分は使う派です。
で、使わない党の方に「暗号みたいなソレ、可読性に関わるからやめて欲しい」といわれたこともあります。
# けっこう根に持ってるwww三項演算子はネストしなければ読みづらいことは無いと思います。
nVal1 = (bSw1 != FALSE) ? 1 : 0; // ネストしてない nVal2 = (bSw1 != FALSE) ? ((bSw2 != FALSE) ? 2 : 1) : 0; // ネストしてる条件ひとつで値を切り替えるのにif書いてelse書いてってするのを書くのが面倒なんですよね。
練習がてらに,F# と Scala にて.
#light let (bSw1, bSw2) = (..., ...) let (nVal1, nVal2) = match (bSw1, bSw2) with | (true, true) -> (1, 2) | (true, false) -> (1, 1) | (false, _) -> (0, 0)
val (bSw1, bSw2) = (..., ...) val (nVal1, nVal2) = (bSw1, bSw2) match { case (true, true) => (1, 2) case (true, false) => (1, 1) case (false, _) => (0, 0) }
さらに,「ネストしたconditional operatorの読み難さはインデント次第じゃなかろうか - 梶本裕介の日記」風に.
const bool bSw1 = ... const bool bSw2 = ... const int nVal1 = bSw1 == true ? 1: 0; const int nVal2 = bSw1 == false ? 0: bSw2 == true ? 2: 1;
あるいは.
const bool bSw1 = ... const bool bSw2 = ... const int nVal1 = bSw1 ? 1: 0; const int nVal2 = !bSw1 ? 0: bSw2 ? 2: 1;
読みやすさという点では確かに違いがあるような気のするものの,簡単な変換で相互に行き来できるという点では,これらの“スタイルの違い”はそれほど強調する必要もないのかな,とも思ったり.そういえば,CLR (CLI の VES) や JVM の場合,同じ (ような) バイトコードになるから同じこと,というロジックで説明をすることもありますね.とまあ最近やっと「意味論こそが本丸」の境地が朧気ながら見えてきたようなそうでないような感じです.
とはいえ,構文論 (syntax) の世界はもういいかというと,まだそこが楽しいと感じてしまうときもあると.実際私も含めて DSL! DSL! 言っている人の大半は syntax の魔力にとりつかれているような気もしますし.
何となく思い出したのが,プログラミングじゃなくて学部時代の物理の話.群論の話がたびたび講義に出てくるようになってきてきたあたりで,周りの物理専攻の人たちの間でもアプローチが分かれ始めていたように思います.「○○と××が同型」みたいなところを一直線に目指す人もいれば,「とりあえず具体的な座標で考えたい」な人もいると.
私と言えば,行列とか四元数とかテンソルとか,使い始めはとにかく syntax と (群論的) 構造の理解がごちゃごちゃになりがちでした.そんな私を含め,理論物理の道に進むわけでもない多くの人にとっては,結局そのごっちゃにした理解のままで困らないかもね,なんてのは確かに似たような話かも.
それでも背後に構造があるのなら,チラッとは見ておきたいというのが今の心境,かな.ってこれも昔話にあるか.
仁和寺にある法師 年寄るまで意味論を拝まざりければ 心憂くおぼえてあるとき思ひ立ちて ただひとり徒歩よりまうでけり