八発白中

技術ブログ、改め雑記

なぜ数ある言語からCommon Lispを選んだのか

はてなに入ってからよく「なんでCommon Lispで書くんですか?」と聞かれます。アリエルにいるときは全く聞かれなかった質問です。今まで当たり前のように受け入れていたことを改めて尋ねられるとはっとさせられます。

Common Lispが一番書きやすいからです」
「あっ…すいませんでした」

なぜ謝られたし。これではまるで僕が変人扱いです。だけどたぶんこれが普通の感覚で、アリエルは変な人が多かったんでしょう。

こう言われることもあります。

「でも、Lispってカッコが多いじゃないですか」

これもまた久しく忘れていた感覚で、思わず答えに詰まってしまいました。Common Lispのカッコがそれほど多くないということは既に証明されているというのに。

先週末にid:m2ymと会って話をしたときにも同じような話をしました。閉じカッコがたくさん続いているとか、letのカッコの数が1個多いとか、そういう表記上の問題なんて本当に些細なことです。英語は単語の間にスペースが入るからダメだ、なんて人はいないですし、言語の本質はもっと別にあります。

そのときにid:m2ymがGuy Steeleの「Growing a Language」というプレゼンを引用していたので今日見てみました。

http://video.google.com/videoplay?docid=-8860158196198824415 Google Videoから削除されていたのでYouTubeで。

The main thing that I want to ask in this talk is: If I want to help other persons to write all sorts of programs, should I design a small programming language or a large one?
I stand on this claim: I should not design a small language, and I should not design a large one. I need to design a language that can grow.

 このトークで最も問いたいことは、さまざまな種類のプログラムを書くことを支援するには小さい言語と大きい言語のどちらを設計すべきか、ということです。
 私はこう主張します。小さい言語も大きい言語も設計すべきではなく、成長可能な言語を設計する必要がある、と。

このGuy Steeleのプレゼンは、特定の機能の有無や、他の言語との比較をすることなく、純粋に言語はどうあるべきかという考えに立ち戻ったものです。

なぜCommon Lispを使うのか、という質問へのよくある答えは、「マクロがあるから」というものです。ただこの答えはあまりに正直すぎて、マクロを知らない (つまりCommon Lispを知らない) 人への答えになっていません。

その点、Guy Steeleの言うように、「成長可能な言語を設計すべきである」という思想から生まれた言語であれば、「マクロ」という機能があるのもまったく自然な話です。

一般的な言語では、バージョンが上がって (たとえばPHP5がPHP20くらいになって) 、だんだんとマシな言語になっていくのを待たなければいけません。一方、成長可能な言語であれば実験的な機能すぐに手元の処理系で使えるようになります。言語設計者も間違いを犯すという実例が数多くあることを考えれば、すべてを他人に委ねるのはあまり良い選択ではなさそうです。

今週末は約1年ぶりにShibuya.lispがありますね。今回は僕もLTをします。

Guy Steeleみたいに「自分もLisp書きたい!」と思ってもらえるような話ができるといいんですけどね。(それは5分じゃ無理だ。id:m2ymに任せよう)