作者: Bruce.
日時: 2008/1/20(13:39)
Bruce. です。



機械伯爵 さんは書きました:
>  現在、一つの実験として、Python → Ruby移行のためページをTSNETWiki
> に作っています。
>  まぁ、Rubyその他の各言語のファンの賛成は得られないのは承知の上です
> が、プログラミングを始めるなら、やはりPythonから、というのが私の信念
> です。

何回か(こことここ以外の両方で)書いてますが、

・前提条件によるのでこれというのは挙げられない(候補は出せる)
・ただし、制約に関する一切の前提条件をおかずに入門言語を一つ挙げろ訊かれ
たらPythonと回答する

という点ではわたしも同じです。もっとも、

Ruby hotlinks: powered by samidare
http://www.rubyist.net/~kazu/samidare/

のDialyの項に名前のないわたしはたぶんRubyistとして看做されてないのでしょ
うがw
それはおいといて。


>  ただ、Pythonから始まって、例えばRubyやPerlのような「便利な書式が存
> 在する」言語の勉強を始めるのはアリだと思うのです。
>  その方法は簡単で、例えばPythonでは正規表現リテラルはありません(し、
> Pythonの方向性から考える限り、多分今後も追加されることはありえないで
> しょう)が、PerlやRubyにはあります。
>  だから、正規表現を大量に扱うCGIやWebアプリケーションデザインのうち、
> 単独、あるいはユニットとして独立していてメンテナンスは一人で行うよう
> な箇所は、正規表現が手軽に使える方が圧倒的に有利でしょう。

まあどっちが先がいいかは考え方次第なのでとりあえずスルーしますが、
Perlの qr<> による正規表現オブジェクトの組み立てとか、Rubyの
Regexp.new での構築なんてのもありますので、一概にリテラルがあれば
いいってものでもないとは思います。

問題なのは、たとえばJavaのように文字列から正規表現オブジェクトを構築する
のだけど
エスケープ文字がぶつかるので、目的のオブジェクトを得るためにエスケープ文字を
重ねなければならなくてただでさえ鬱陶しいエスケープが倍増するということで
すね。

Pythonの場合は r'' 形式の文字列がありますので倍増問題はとりあえず回避で
きますけど。

#[]内部で無用に連発されるエスケープに殺意すら覚える今日この頃

あー、ここまで書いてなんか勘違いしてる気がしてきた。
けどいいやw

>  で、本題。
>  まぁ、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を愛用している方々、「ブロックってこん
> なに便利なんだぞ」的な例をご教示いただけたら、と思います。

んーとRubyのblockは結構便利に使われてるので、blockでこんなに便利という例
で云うと

open('ほげほげ', 'r') { |f|
   ファイルから読み取って行う処理
}

とかすると自分で close しないでもステートメント終了時にcloseしてくれるよ。
っていうのもありますけど、これは機械さんが想定しているのとはたぶん違いま
すよね?
#これはPythonだとwith構文使うんでしたっけ?

あと、「Lispでブロック」ってのが良くわからんのですが、具体的にどういう
記述を考えられてます?
ひょっとして closure のことを云ってるのでしょうか…

-- 
木村浩一/KIMURA Koichi/Bruce. who love generator :)

 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html