OnLisp 関連
「圏外からのひとこと」に、ここの文章が引用されていた。
これ読んでると、RubyがだんだんLispに見えてくるんですよ。「なんてすばらしいんだRuby。…でもそれは、そのプログラマーがうまくやりさえすれば」なんですよね。
ネタ元は、http://d.hatena.ne.jp/sshi/20050403/p2
essaさんは「Rubyもそう思える」と書いてらっしゃるけど、実はこの文章は心の中でLispとRubyを比較して書いていてました。どの言語をどう思うかは人それぞれなので、別に何をいうつもりもないんですが、そう書かれてみてもう一度考えてみたのでそれをここにも書いておこう*1。
LispとRuby双方の言語の仕組みを考えると、Lispは関数(マクロ含む)しか提供してなくて、Rubyはオブジェクト指向の枠組を提供してる。言語自体がある枠組を提供していると、プログラマは提示されている概念に従ってプログラムを組みたてることができる。いまやオブジェクト指向の方法論はデザインパターンをはじめとして腐るほど提供されているので、概念を学ぶことも容易だろうし。
ただ一方で、ありものの概念にのっかっているということは、その概念の限界も同時に備えてしまう。例えば、オブジェクト指向の枠組にのっかった思考ではファクトリパターン使ってああしてこうひねって、みたいに何段階かテクニックを使わないとすっきり組めないコードが、Lispのマクロでやれば一発でできちゃう、ということもあるだろう。
確かに「オブジェクト指向言語」といわれる言語の中ではRubyはとびぬけて*2柔軟だけど、それでもオブジェクトが中心であることは間違いない。「クラスは泣きながら3回書きなおすもの」なんて言葉も、(クラスベースの)オブジェクト指向の制約の不自由さのあらわれなんじゃないだろうか。クラス設計は本質的に難しく、そしていったん作成してしまったクラスの変更コストが高いことを示していると思う。
というわけで僕の中ではRubyは「言語作成者のレールにのっかって」プログラムを書く言語なのでした。
ひるがってLispを見ると制約もないかわりに指針もなんにもなくて、慣れてないプログラマはまず間違いなく途方にくれる。一度コツをつかんでしまえば、制約のない約束の地に辿りつけるんだろうけど*3。
制約があることには目をつぶって皆のゆくオブジェクト指向道をたどるのか、あるいはモーゼを探して(あるいは自分がモーゼになって)、約束の地へ向かうことを夢みてLispにはげむのか。この二つ、どっちがいいのか僕の中でも答えがでていない*4。
現状だと間違いなくRubyのほうが手になじんでいるのだけれどなあ。モーゼどっかに転がってませんかね?
ああ、あくまでこれは個人的にプログラミングをする時のことを考えてて、チーム組んでやる時のことは考えてません。念のため。