作者: 機械伯爵
日時: 2008/1/20(12:50)
 現在、一つの実験として、Python → Ruby移行のためページをTSNETWiki
に作っています。
 まぁ、Rubyその他の各言語のファンの賛成は得られないのは承知の上です
が、プログラミングを始めるなら、やはりPythonから、というのが私の信念
です。
 ただ、Pythonから始まって、例えばRubyやPerlのような「便利な書式が存
在する」言語の勉強を始めるのはアリだと思うのです。
 その方法は簡単で、例えばPythonでは正規表現リテラルはありません(し、
Pythonの方向性から考える限り、多分今後も追加されることはありえないで
しょう)が、PerlやRubyにはあります。
 だから、正規表現を大量に扱うCGIやWebアプリケーションデザインのうち、
単独、あるいはユニットとして独立していてメンテナンスは一人で行うよう
な箇所は、正規表現が手軽に使える方が圧倒的に有利でしょう。
 同様に、計算なんかが多い場合はLispやSchemeに移行するのも手でしょう
し、GUIのしっかりしたアプリケーション(あるいはOSレベル)のカスタマ
イズなどは、Smalltalkが有利になることもあるでしょう。
 Pythonistaの中で「Pythonがあれば他は要らない」と言ってる人はごく少
数はで、殆どは他言語との住み分けを考えてると思うのです。

 ……で、ここまでは「前置き」であり、私の完全な私論なので、反論され
てもまず何も言い返せないことを先に言っておきます(笑)

 で、本題。
 まぁ、Rubyを皮切りに、Pythonをある程度修得している人向けに、他言語
をPythonで記述し、「こういう言語ならこういう場合、こんな風に(スマー
トに|わかりやすく|簡潔に、など)書けます」なんてことをぼちぼちとか
いていこうと思って、はたとひっかかったのが、タイトルにも書いた「ブロッ
クの抽象化」です。
 私はSmalltalkとRubyとLispの(全てに)貧弱な知識しかありませんが、
ただ、ブロックを抽象化して渡す手法を以てイテレータなどの構造を再現す
ることができる、と認識しています(Smalltalkはこの方法だけですが、Rub
yやLispでは、それ以外の文法構造もある、ですよね)
 で、ご存知の方はご存知の通り(……日本語になってねーよ)Pythonでは、
式として表現できるものに関しては、上言語と同様に手続き(関数)を直接
lambda文(関数リテラル?)として渡すことができるのですが、Pythonでlamb
daで表記できるのは式文だけであり、他の文構造や、代入文の混じったもの
は一切記述できません。これが、Pythonの記述上の欠陥であるとよく言われ
てきました。
 ところで、Pythonも様々な構文が加わり、例えばif文などの文は、以前で
もand/orの組み合わせで書けましたが、現在ではif-elseの条件付き評価式
で普通に書けます。内包記法はmapの置き換えですからあまり意味が無いと
しても、リストやジェネレータを返すループは普通に書けます。
 そして、Python 3000においてはexec文が関数扱いになりますので、事実
上、どんな文でも、lambda d: exec('<文>',d)という形で表記することが一
応可能となりました。
 ここで、ふと考えたのですが……
 もし、「(Pythonでいう)文を含んだブロック」が「かなり」有用ならば、
この例を出して「こういうことが他言語(Ruby | Smalltalk | Lisp)ではス
マートに書けるんだよ」と、紹介すれば簡単なのですが、普段、ブロックを
使い慣れていないせいか、「文を含んだブロック」をいかなる状態で使うの
か、というのが簡単に思いつきません。
 単純な式文ならLambdaでも内包表現でも問題無いわけですし、複数代入と
かなら、lambda文のタプルで話は済みます。
 ローカル変数を使った手続きが必要なら、なるほど「lambdaで無理に書け
ないこともないだろうけど分かり難い」という理屈はわかりますが、逆にそ
こまである程度長い文であるならば、名前をつけて関数/手続き定義しても
問題なかろ、とか思ったりする訳です。
 どうぞ、RubyやSmalltakやLispを愛用している方々、「ブロックってこん
なに便利なんだぞ」的な例をご教示いただけたら、と思います。

 /機械伯爵/自分の時間計算の出来ない男/