#:g1: collectorsの紹介

Posted 2014-07-17 13:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の198日目です。

collectorsとはなにか

 collectorsは、Acceleration.netの人達による集積系構文のライブラリです。

パッケージ情報

パッケージ名collectors
Quicklisp
CLiKiCLiki: collectors
Quickdocscollectors | Quickdocs
CL Test Grid: ビルド状況collectors | CL Test Grid

インストール方法

(ql:quickload :collectors)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 元々は、Arnesiの一部として配布されていたマクロのようですが、Arnesiの開発停止に伴い有志により独立したパッケージとして引き継がれているようです。
基本的に値を集積していく受け皿となる側と、値を投げる側の二つで一つの構文というところ。

 with-reducerが一番汎用的なものになっていて、文字列やリストに特化したものも用意されている感じです。

(collectors:with-reducer (r #'append)
  (r '(1))
  (r '(2))
  (r '(3)))
;=>  (1 2 3)

(collectors:with-collector (a) (a 1) (a 2) (a 3)) ;=> (1 2 3)

(collectors:with-collectors (a b) (a 1) (b 10) (a 2) (b 20) (a 3) (b 30) (list (a) (b))) ;=> ((1 2 3) (10 20 30))

(collectors:with-string-builder-output (s) (s #\f) (s #\o) (s #\o)) ;=> "foo"

 with-collectorは、Arcにあるマクロで中々使い勝手が良いaccumと同じですね。

(accum a 
  (a 1)
  (a 2)
  (a 3))
;=>  (1 2 3)

 上記以外にも自前で集積するマクロを組みたい場合に使えるプリミティブが用意されています。

まとめ

 今回は、collectorsを紹介してみました。
LOOPが便利なのもcollect節での値の集積の使い勝手が良いからというのが結構大きい気がしていますが、そのcollect節だけ抜き出したようなものですね。

comments powered by Disqus