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に続いてこちらも小さなリリースですが、興味があればお使いください。