#:g1: CLISP: Weak Objectsの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の345日目です。

CLISP: Weak Objectsとはなにか

 CLISP: Weak Objectsは、CLISPの弱参照を扱う仕組みです。

パッケージ情報

パッケージ名CLISP: Weak Objects
ドキュメント31.7. Weak Objects

インストール方法

 CLISP標準の機能です。extパッケージで定義されています。

試してみる

 CLISP: Weak Objectsがサポートしている各種形式ですが、割合に充実しています。

 最も基本になるのは、Weak Pointersですが、こんな感じにGC時に参照されていなければ消えます。

(defvar *wp*
  (ext:make-weak-pointer (list 1)))

(ext:weak-pointer-value *wp*) ;=> (1) ; T

(gc) ;=> 6540000 ; 1635000 ; 164808 ; 414 ; 460917632 ; 1032000

*wp* ;=> #<BROKEN WEAK-POINTER>

(ext:weak-pointer-value *wp*) ;=> NIL ; NIL

 この仕組みでリスト、alist、ハッシュテーブルの弱参照版が作られていますが、リストの場合は、weak pointerでリストを作るよりは効率が良いそうです。

(defvar *a* (list 'a))

(defvar *weak-list* (ext:make-weak-list (list *a* (list 'b) (list 'c))))

(ext:weak-list-list *weak-list*) ;=> ((A) (B) (C))

(gc) ;=> 6523344 ; 1630836 ; 164808 ; 403 ; 445232856 ; 920000

*weak-list* ;=> #<WEAK-LIST ((A))>

(ext:weak-list-list *weak-list*) ;=> ((A))

 Weak Relationsのorとandは、リスト内で参照されているものが一つでもあれば、全体が生きるのが、or、全部生きていなければ破棄されるのがandです。

(defvar *a* (list 'a))

(defvar *weak-and* (ext:make-weak-and-relation (list *a* (list 'b) (list 'c))))

*weak-and* ;=> #<WEAK-AND-RELATION ((A) (B) (C))>

(gc) ;=> 6521192 ; 1630298 ; 164808 ; 395 ; 432755648 ; 852000

*weak-and* ;=> #<BROKEN WEAK-AND-RELATION>

(defvar *weak-or* (ext:make-weak-or-relation (list *a* (list 'b) (list 'c)))) ;=> *WEAK-OR* *weak-or* ;=> #<WEAK-OR-RELATION ((A) (B) (C))>

(gc) ;=> 6521112 ; 1630278 ; 164808 ; 396 ; 434142344 ; 880000

*weak-or* ;=> #<WEAK-OR-RELATION ((A) (B) (C))>

 Weak Associationは、keyとvalueでkeyが生きていれば、組の値も参照できるというものです。

(defvar *key* (list 1))

(defvar *wa* (ext:make-weak-mapping *key* :value))

(ext:weak-mapping-value *wa*) ;=> :VALUE (setq *key* nil)

(gc) ;=> 6523888 ; 1630972 ; 164808 ; 429 ; 484286112 ; 1144000

*wa* ;=> #<BROKEN WEAK-MAPPING>

(ext:weak-mapping-value *wa*) ;=> NIL

仕組みの紹介としてはこんな感じですが、ユーティリティも充実していて使い勝手が良さそうです。ユーティリティの詳細はドキュメントと参照のこと。

まとめ

 今回は、CLISP: Weak Objectsを紹介してみました。
ざっと最近の処理系を見渡したところ弱参照のサポートの充実具合は実はCLISPが一番のようです。
CLISPは地味に充実しているところがあったりしますね。

comments powered by Disqus