#:g1: dlistの紹介

Posted 2014-02-10 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の42日目です。

dlistとはなにか

 dlistは、Krzysztof Drewniak作の双方向リンクリストのライブラリです。

パッケージ情報

パッケージ名dlist
Quicklisp
CLiKihttp://cliki.net/dlist
Quickdocshttp://quickdocs.org/dlist

インストール方法

(ql:quickload :dlist)

試してみる

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

 双方向リストで利用するプリミティブな操作関数は勿論のこと、map系の関数や、do系のマクロも定義されています。

基本的なところ
(dlist:dcons 1 2 nil)
;=>  #S(DLIST:DCONS :PREV 1 :DATA 2 :NEXT NIL)

(dlist:next (dlist:dcons 1 2 nil))
;=>  NIL

(dlist:prev (dlist:dcons 1 2 nil))
;=>  1
便利なユーティリティ関数など
(apply #'dlist:dlist (*:iota 10))
;=>  #<DLIST:DLIST (0 1 2 3 4 5 6 7 8 9)>

(dlist:mapdlist (lambda (x) (* 2 x)) (apply #'dlist:dlist (*:iota 10))) ;=> #<DLIST:DLIST (0 2 4 6 8 10 12 14 16 18)>

Generic sequencesとの連携

 SBCLや、ABCLではGeneric Sequencesという拡張があり、ユーザーが定義した任意のシークエンス型をCommon Lispの標準のシークエンス関数でも利用することを可能にしていますが、dlistでは、このGeneric Sequencesの定義がされているので便利に利用できます。

(coerce (apply #'dlist:dlist (*:iota 10)) 'list)
;=>  (0 1 2 3 4 5 6 7 8 9)

(coerce (*:iota 10) 'dlist:dlist) ;=> #<DLIST:DLIST (0 1 2 3 4 5 6 7 8 9)>

(length (coerce (*:iota 10) 'dlist:dlist)) ;=> 10

(dlist:mapdlist (lambda (x) (* 2 x)) (coerce (*:iota 10) 'dlist:dlist)) ;=> #<DLIST:DLIST (0 2 4 6 8 10 12 14 16 18)>

(map 'dlist:dlist (lambda (x) (* 2 x)) (*:iota 10)) ;=> #<DLIST:DLIST (0 2 4 6 8 10 12 14 16 18)>

dlist:dlist型だけあれば、大抵の処理はほぼ標準関数で済んでしまいそうです。

まとめ

 今回は、dlistを紹介してみました。
Generic Sequences対応のライブラリが増えると楽しそうです。

comments powered by Disqus