感想の感想
- sshi.Continual: LL魂(LLSpirit)に行ってきましたよ (http://d.hatena.ne.jp/sshi/20070805/p1#seemore)
感想がすごい良くまとまっている。Pythonのところは細かいところだが少し気になった。
Pythonの「同じ機能は誰が書いても同じになる」って話を聞いた時にいつも思うのは「じゃ人間が書かなくてもいんじゃね?」ってこと。そこまで同じになるならコンピュータに生成させることはできないんだろか。
他の人も書いていたと思うけど、同じ機能は誰が書いても同じになるっていうのはちょっと語弊があると思う。書き方が同じになるというだけで、内容的には同じにならない。ロジックなど内容が同じだとしても、当然だが実装も一意的に決まらないので、ルールをつけないと同じ実装にならない。でもルールにするには多すぎる。例えば、呼び出し可能オブジェクトを必要とする場合に関数オブジェクトでも良いし、呼び出し可能なクラスオブジェクトでもよいし、関数オブジェクトはlambda式で書いても良いし、def文で書いても良いなど。あと、互換性の問題で残している機能もある。文字列操作はビルトインのstrでもできるし、stringモジュールでも同じ機能の関数を持っている。
そこまでいわなくても、パターンとして取りだして圧縮とか(Lispマクロ病患者の戯言)
そういう部分は汎用性があって既にライブラリ化されている可能性が高いと思う。しかしながら、Pythonでは読みやすいが、よく使うロジックも冗長だなと思うところが多々ある。例えば、ジェネレータの先頭から10要素取り出すなどの処理は面倒で、以下のようになる。そういう部分はライブラリ化したい。
import itertools g = itertools.count() # ジェネレータを作成 # for文を使って取り出す for i in range(10): print g.next(), # もしくは、リスト内包表記で取り出す print [g.next() for i in range(10)] # しかし、こう書きたい! print g[:10] # もしくは、こう! print g.take(10)
ジェネレータなんて無限リストみたいなものなんだからリストと同等に扱えても良いのではないかな。あと、mapやリスト内包表記を使うときに式1つしか書けないので、Rubyのmapとコードブロックを組み合わせた方法で実現できることと同等な事がしたい時に関数を使わないといけないのはいけてない…。
Python自体の言語設計ポリシーや開発スピードは良いのだけれども、機能面では、ちょとしたコードを書くときにもうちょっと効率良い書き方したいと思うことが多い。デコレータ自体は使いこなしていないからすばらしいと思うけど、デコレータが引数を持つときに嫌だし、リスト内包表記も上記の問題が嫌だし、ジェネレータ関数の定義の中で再帰的にジェネレータ関数を呼び出すのにダイレクトに呼び出せなくてfor文を使用しないといけないのはPython以外の言語でもそうなのかな。
色々使ってくると欠点も見えてくるが、所詮完璧な言語はないのでバランスが大事でRubyと比較するためにも使いこなしたいのだけれども時間や余裕がない。むしろ昨日以来、javascriptに興味が出てきた。
追記:
一応、itertools.islice(g, 10)でできたので、とりあえずこれで妥協かな。Pythonはジェネレータまわりは弱いからitertoolsモジュールがあるのか。結局、良く使う機能が別のモジュールやクラスの中に入っているところが気になったというだけか…。するとRubyのMix-inて結構良いアイデアなのかな。ビルトインのジェネレータクラスはないからMix-inのみではダメだが、ジェネレータクラスを自分で作成すれば、g.take(10)は可能。絶対やらないけど。