#:g1: gauche.collectionの紹介

Posted 2014-06-20 12:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の171日目です。

gauche.collectionとはなにか

 gauche.collectionは、Gaucheのコレクションタイプ全般に共通で便利に利用できる枠組みを提供するモジュールです。

パッケージ情報

パッケージ名gauche.collection
マニュアルGauche ユーザリファレンス: 9.4 gauche.collection - コレクションフレームワーク

インストール方法

 Gaucheの標準で添付されているので、

(use gauche.collection)

のみで利用可能です。

試してみる

 マニュアルに一通りの説明があり、リスト操作の関数に馴れている人ならば、すぐに使い方も分かるような構成になっています。

 マップや畳み込みとして、

 要素を探したり、除外したり、まとめたりするものとして

 変換するものとして

 その他、

があります。

 これらについて、標準で

が利用可能になっていますが、

 ユーザーが枠組みを拡張するために

が用意されていて、<collection>を継承してcall-with-iteratorを実装すれば拡張可能になっています。
例えば、双方向リストを作法に則って作成すれば、gauche.collectionで提供されている関数がそのまま利用できて便利という具合。

 個人的に便利だなと思うのは、<hash-table>の統合のされ具合で、

(~ (map-to <hash-table> values '((e . 4) (c . 2) (g . 6) (f . 5) (b . 1) (a . 0) (d . 3)))
   'e)
;=> 4

(~ (map-to <hash-table> cons '(e c g f b a d) '(4 2 6 5 1 0 3)) 'e) ;=> 4

(let ((tab (map-to <hash-table> cons '(a b c d e f g) (iota 100)))) (list (~ tab 'a) (~ tab 'c) (~ tab 'e))) ;=> (0 2 4)

(let ((tab (map-to <hash-table> cons '(a b c d e f g) (iota 100)))) (coerce-to <list> tab)) ;=> ((e . 4) (c . 2) (g . 6) (f . 5) (b . 1) (a . 0) (d . 3))

こんな感じで既存のリスト操作のイディオムとの統一感もあって使いやすくなっています。
また、

(group-collection '((a 1) (c 2) (a 3) (d 2) (z 3) (a 1) (c 2) (z 1) (a 2) (c 3) (d 2) (e 3))
                  :key car)
;=> (((a 1) (a 3) (a 1) (a 2)) ((c 2) (c 2) (c 3)) ((d 2) (d 2)) ((z 3) (z 1)) ((e 3)))

も、ちょっとした時に使いたいこと多い処理なので便利だなと思います。

まとめ

 今回は、gauche.collectionを紹介してみました。
gauche.collectionは使い勝手が良いので、Gaucheに限らず他の方言や処理系にもあったら良いなあと思ったりです。

comments powered by Disqus