真面目に考えると
クロージャさえあれば、if 文は本当に排除できますし、そういう言語は多分もうありますよね。
ただ、そんな感じでif文を仮想関数で代用して、組み込みのbool型をやめて、BoolインターフェイスとTrueクラスとFalseクラスを導入するのがベストなのかと言われると微妙な気分。
インターフェイスみたいな方法で実現すると、拡張性が発生するんですよね。当然ですけど。Boolインターフェイスを実装した True でも False でもないクラスが作れるわけで。もちろんそれはある面いいことなんですけど、そういう形で拡張してしまうと、それはもう「真か偽か」だけでできている真理値 boolean value ではありません。
本当に十分形式化されている概念を実現する場合、拡張可能性はむしろ表現の直観的理解を阻害する気がします。
本当に純粋なオブジェクト指向
の言語には、if文がありません。
全部仮想関数で済ませるから。else文がない時は、デザインパターン的にいうと Null Object で片付けるから。
という夢を見ました。
夢の中の僕は激しく納得しました。
今日PHPさまについて学んだこと (迫害されるリテラル編)
必要にかられて、みんな大好き PHP のおべんきょうを始めました。始めました……始めちゃいました……。もうね。聞きしに勝る奥深さに毎日が新鮮な発見ですよ。今日も一つ賢くなっちゃった!
- クラス名(文字列)を代入した変数からインスタンスを生成できる。(○: new $class_name)
- でも文字列リテラルからだとできない。(×: new 'Hoge')
- 生成したインスタンスを代入した変数からメソッドを呼び出せる(普通)。(○: $hoge->method())
- でも生成したインスタンスそのものからはできない。(×: (new Hoge)->method())
あー?
ちなみに PHP 5.2.6 の話ですが、そんなことはどうでもよくて 2. と 4. を知った僕の衝撃ですよ問題は。PHP 的な世界観においては、この仕様が正義なのでしょうか。浅学にしてこの深谷、副作用もないのにこうもあっさり置き換えモデルが通用しない言語は初めてです。どうやら PHP さま、一回全部変数に入れないとお気に召さないようで……ってそんな馬鹿な。アセンブリかお前は。
多分、これ $ が鍵だと思うんですよ。実装見てない、っていうか見る気しないから適当言ってますけど。変数は全部頭に $ だ! って決めちゃったから、パーサがとんでもねー手抜になってるんだと思います。$ のせいで。あーあ、なんだよ結局 $ か。ドルですか。お前らそんなに金が好きですか。僕も大好きです。でも今は円高だよ?
コンパイラのエラーメッセージって
ナニユエこのご時世にまだプレーンテキスト text/plain なんですかね?
XML でも YAML でも JSON でも S 式でもなんでもいいから、とっとと構造化したらいいと思うんですが。(と Lisp に媚びる僕。)
Eclipse みたいな IDE とコンパイラを連携させる時とか、どう考えても構造化・標準化されてる方がラクです。Vim の quickfix (:make でコンパイルしてエラー個所を :cn で巡回できる機能) とかもそう。Vim の場合、正規表現でごりごりパースしてる雰囲気を勝手に感じるんですが。(OCaml のコンパイルエラーとかだとパースがおかしくて、なんか哀しいものがあります……)
もちろん言語によってエラーの内容は変わってくるはずですが、
- エラーの発生個所(ファイル名・行数・桁数 etc.)
- エラーの種類(エラーなのか警告なのかはたまた deprecated な仕様の通知なのか)
- 詳細なエラーメッセージ
ぐらいは何の言語でもあると思うしこんだけあれば大体事足りると思うわけです。
なんでこんなの誰もやってねーんだろか、首を傾げる僕であります。まあ逆に言うとコンパイラと連携するっていう地味ーなジャンルのプログラムにしか関係ないんですけど。それとも単に僕が知らないだけかしらん。
追記 (2009-01-04 01:47)
ブクマコメに反応。
>『ぐらいは何の言語でもあると思うしこんだけあれば大体事足りると思うわけです』ってそれだけならplainで十分な気。 (id:omaya さん)
ん? 僕は「再利用がラクなように構造化したらどうよ」と言ってるだけなので、plain text だろうがなんだろうが、機械的にパースできる仕様に従ってくれてれば文句ないわけですが……。しかし今時 plain text で新たに何かフォーマット作るくらいなら XML 使いません?
それとももしかして現状肯定の意見なのかな。確かに今出回ってるコンパイラのメッセージは大概 plain text で、上に挙げた情報はほとんどの場合入っていると思います。が、複数のコンパイラのメッセージが一つのルールでパースできるようにはなってたりは、全然しないと思いますよ。一応。