八発白中

はてなブログに引越しました。

Lispユーティリティの新しい解決案「Quickutil」

今、新婚旅行のためシリコンバレーのSanta Claraというところに1週間ほどいるのですが、途中から妻を無視してステイ先のRobert Smithとハッカソンを始めてしまってまじごめんみたいな感じです。

とはいえ、まあこれも思い出ということで……新しいCommon Lispライブラリ「Quickutil」というものを作ったので紹介します。

ユーティリティ

まとまったプログラムをしているとほぼ必ず使うことになるであろうものは「ユーティリティ」です。

Common Lispプログラマなら以下のようなことを思ったことがあるのではないですかね。

  • Alexandriaは大きすぎる……
  • なんでAlexandriaにあの関数ないんだよ……
  • aandのためだけにarnesi……*1
  • split-sequence……

そんな微妙な行き違いの結果、みんなオレオレユーティリティ集を作るみたいなことが発生する。

そしてasdfファイルがこんな感じになる。

(:depends-on (:alexandria
              :metatilities
              :kmrcl
              :anaphora
              :f-underscore
              :split-sequence

              ;; えっと他には……
))

ほんとひどい。

utilizeしろ!

Quickutilはそれを解決するために作られたライブラリです。

たとえば、iotaという関数が必要だと思ったら、qtl:utilizeを使います。

(qtl:utilize :iota)

こうすると、quickutilパッケージにiotaがインポートされます。

(qtl:iota 10)
;=> (0 1 2 3 4 5 6 7 8 9)

必要なユーティリティが複数ある場合は同時に指定できます。

(qtl:utilize :iota :riffle)

(qtl:riffle (qtl:iota 5) '--)
;=> (0 -- 1 -- 2 -- 3 -- 4)

Quickutilは必要なときに、必要なだけ使えるユーティリティライブラリです。

ファイルに保存

REPLでいろいろ試すにはこれでもいいですが、ライブラリを書くときなどはファイルとして保存するのが便利です。

qtl:save-utils-as で、必要なユーティリティのみを指定してファイルに保存できます。

(qtl:save-utils-as #P"/path/to/save/utils.lisp" :range :weave)

保存したものをそのまま自分のライブラリに入れてもいい*2ですし、最新を追いたければasdfでロード後にユーティリティを自動でロードして保存するようにしてもいいです。

まとめ

Quickutilは、ILC2012で知り合ったRobert Smithの発案で一緒に作りました。

Robertもブログ投稿をしています(英語)。こちらはもっと詳細になぜ作ったのかまで書いてあるので興味があればご一読ください。

今日の夕方頃、とりあえず動いたのでリリースしよう、みたいな雰囲気で、ロゴの横に小さな「β(ベータ)」をつけて公開しました。今はそのコンセプトについて広くフィードバックを求めているところです。

他に何人かにはIRCやメールで直接フィードバックをいただいています。

今のCommon Lispのユーティリティについて問題だと感じるか、Quickutilを使うかどうか、Quickutilがベストでないとすれば自分だったらどうするか、など、幅広くフィードバックをいただけると助かります。

*1:anaphoraのaandは2つ目以降のitを再束縛しないため問題になる。たとえば (aand 1 (* it 2) (* it 2)) は4が返ることを期待するが、実際は2が返る。

*2:QuickutilのユーティリティはすべてPublic Domainでライセンスされています。