ステップ数/時間で考えると、CommonLispはあまり、高い数字ではないかもしれない。三時間ぐらいうんうん唸ってできあがったのが五行ぐらいの関数だったりする。これはぼくの能力に問題があるのかもしれないが、じゃ、それでCommonLispは効率的ではないか、というとそうでもない。
同じロジックを別の言語——たとえば、javaとか、Cで組むと、あっという間にふくれあがることはまちがいないからだ。
で、今回、驚いたのはひとつの関数をいろいろいじっていたらいつの間にか、汎用性のあるユーティリティになってしまったことだ。もしかしたらこれ、alexandriaにあるんじゃないか、と不安になるほど。別に業務ではなく、個人的にやっていたプログラムなのだけど1。
こんな経験はじめてだったのでしばし唖然としてしまった2。
プログラミングしているうちにユーティリティができあがってしまったというのは——ここのロジックは共通化できるな、とか気づいてくくりだしたりはよくあることだけど3。
同じLisp族のelispででも経験したことがない。
どうしてだろう。elisp的には
(require 'cl)
があるので言語的な差はそれほどないはずなのだけど。
たまたまなのか、もしかすると——。
elispだと、関数名などシンボル名のコンフリクトを避けるため、接頭語をつけることが習わしになっている。「org-」とか。CommonLispだとdefpackageで名前空間を分離できるので平気で「select」とか、「check」とかにできる。コンフリクトが起きてしまったときは総称関数化で対応できる可能性も高いし。ユーティリティになってしまったらパッケージの位置を変えるのも容易だ。
そうやって考えると、案外、defpackageの有無の差は大きくて、固有名になっていないということで心理的に、抽象化が進むのかもしれない。
——最終的に。
そうやってできあがったユーティリティ自体が溶けてなくなってしまったことだけれど4。