「Rubyの作者松本氏がありもしない錯誤をでっちあげて批判している件」について

fromdusktildawnさんの分裂勘違い君劇場「 Rubyの作者松本氏がありもしない錯誤をでっちあげて批判している件 」を読んだ。

こうして議論が膨らんで、何が何でもRubyとか、何が何でもCLOSとか、そういう誤読を防止する仕組みができあがっていくことは喜ばしい。それ以上に、これを機会にRubyに関心を持つ人がでてきたり、JavaScriptを再発見したりする人がでてくるようなことがあったならば、喜ばしい。「騒げ騒げ、もっと騒げ」

のだけれども、取り合えず言うべきことは言っておこう。

getter/settterネタ

これは実はちょっと心外。「実務上、メタプログラミングは便利だよ」と言いたくてその一例たるattr_accessorの説明の直後に

ですから,このようなメソッドを自分で作ることもできます

...

少しでも似たようなコードの反復があるならばメタプログラミングによって実装や保守の手間を軽減できます\

getter/setterのようにあまり変化する余地のないものであればまだよいですが,仕様に応じて変更の必要が出てきた場合,その変更をコードに漏れなく反映するのは大変です

と書いた私としてはgetter/setterという例がやはり良くなかったなーと。getter/setterに注目して、そこだけに注目する議論は、私の説明不足が原因とは言え嬉しくないなーと。

長すぎて削られてしまったRuby/AJPのクラス群自動生成の例を、やっぱり何が何でも紙面に出してもらうべきだったかなぁと。

getter/setterはC#ではわざわざブロパティ定義構文を作って楽にしてるわけだし、そもそもIDEがあればJavaでも全然問題ないというのはおっしゃる通り。なんだけれども、分裂勘違い君劇場「 Rubyの生産性の高さはどこまで本当か? 」において

Rubyのシンプルなプロパティ定義として、以下のようなサンプルがあり、setterとgetterをわざわざ記述しなければならないJavaの冗長さと比較していますが

という風にメタプログラミングの文脈から切り離してわざわざこれをクローズアップするのは「Rubyの作者松本氏がありもしない錯誤をでっちあげて批判している件」で自身が指摘している引用トリックそのものだろうと。

まあ、3点断りを付けると、

  • これは分裂勘違い君劇場の次のネタかもしれなくて、そうだとしたら申し訳ない。突っ込みどころを残してあとで自分で突っ込んで読者の視点を多様化/深化させるのはあの人の芸風だから。
  • あちこちで同様のgetter/setterにフォーカスした読み方をしている人がいることから、そもそも「 なぜ仕事で使うとうれしいのか 」における私の説明が至らなかったのは確実だろう。
  • getter/setterをメタプログラミングの文脈から切り離すのがアンフェアだとしても、fromdusktildawnさんの「『メタプログラミングが強力だからRubyが生産性が高い』というのはどこまで本当か?」という指摘のほうは否定されたわけではない。

Rubyの生産性の高さはどこまで本当か?」は、私が期待していた突っ込みそのもので、しかもそれを分裂勘違い君劇場がやってくれたというのは嬉しい限りなんだけれども、getter/setterネタだけじゃなく「その他、細々とした部分」の節だけはどうにも不満がいっぱいで。

実際には、Javaでは、以下のようにカウンタを使わない、シンプルなループ記述ができます。

という記述も、だから私は脚注にそう書いてるじゃん。とか。これも引用のトリックだぁな。

Matzは特殊条件を外しているか

Matzにっきの記事 の引用部だけ見れば「Rubyの作者松本氏がありもしない錯誤をでっちあげて批判している件」が指摘するように、「誤読を招く」「本来よりもあまりに強い主張をしているようによませる」アンフェアな引用だなぁ。引用トリックだなぁ。

でも、じゃあ、まつもとさんの言ってることは無効なのかというとわからない。

それは結局「Rubyの生産性の高さはどこまで本当か?」でfromdusktildawnさんが指摘する、(メタプログラミングによるエレガントな解決は)

  • 「圧倒的多数のプログラマが日々格闘している、圧倒的多数のアプリケーションでは、生産性も気持ちよさも、実際には、それほどかわらんですよ」
  • 「研究室レベルのプログラミングは別ですよ」

というのが真かどうかに掛かるかなぁと。もしこれが偽だとすれば、まつもとさん言うfromdusktildawnさんが「(メタプログラミングを必要とする局面において)些細な文法の違いから来る記述力を無視しすぎ」と言う指摘は、「研究室レベルで」というコンテキストを外しても有効となる。

私の実感では偽なんだけど、客観的根拠を示せないからなんとも。

それから、たぶん、まつもとさんの発言はブロック構文にも掛かっている。何しろ私がブロック構文を最初に理解したときにまず思ったのが「何でlambdaじゃダメなの?」だし、fromdusktildawnさんの主張も分かる。匿名クラスでできるのは分かってる。delegateでできるのは分かってる。というか、lambdaかわいいよlambdaの一言に尽きる。

でも、使ってみて思ったのは、Rubyのブロック構文がメソッド呼び出しの括弧を省略可能というところと結び付いて「記述力」をもたらしてるということ。いつも似たような例で恐縮だけれどもRakeとか。Rakeを見るまで、私ゃRubyの記述力がそれほど優れていると思ってなかったし。それから、その種の記述力の差は大きいと思えばこそ、(どうも私が当初、良く吟味せずに舞い上がった程簡単な話ではない模様だけれども) 矢野勉さんの発想 は素晴らしいと思ったのだ。