八発白中

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

Common LispのProperty Listユーティリティ「Multival-Plist」を公開しました

Clackではライブラリ内で使うユーティリティをsrc/util以下に置いているのですが、その1つであるgetf-allを独立ライブラリの「Multival-Plist」として公開しました。

通常、Property List(属性リスト)へのアクセスにはgetfを使いますが、リストに複数のキーが含まれている場合は最初に見つかったものを1つしか返してくれません。getf-allを使えば、マッチするキーの値をまとめてリストにして返してくれます。

(defparameter *plist* '(:foo 1 :bar 2 :foo 3))

(getf *plist* :foo)
;=> 1
(getf-all *plist* :foo)
;=> (1 3)

(remf-all *plist* :foo)
;=> T
(getf-all *plist* :foo :undef)
;=> :UNDEF

こういうのはAlexandriaにあってもよさそう、と作ったあとに思いました。

利用シーンがなかなか思い浮かばないかもしれないですが、たとえばClackではClack.Requestでのクエリ文字列へのアクセスに使っています。チェックボックスを含むフォームを送信したとき、クエリ文字列に「name=fukamachi&name=m2ym」のように複数のキーを持つものを受け取ることがあります。getf-allはこのようなものもProperty Listとして自然に扱えるため便利なわけです。

Circular-Streamsに続いてこちらも小さなリリースですが、興味があればお使いください。