#:g1: com.informatimago.clext.closer-weakの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の356日目です。

com.informatimago.clext.closer-weakとはなにか

 com.informatimago.clext.closer-weakは、Pascal Bourguignon氏作のCommon Lispで弱参照を扱うためのライブラリです。CLISPの弱参照のAPIを参考にポータブルに実現したもののようです。

パッケージ情報

パッケージ名com.informatimago.clext.closer-weak
Quicklisp

インストール方法

(ql:quickload :com.informatimago.clext)

試してみる

 以前CLISPの弱参照のライブラリを紹介しましたが、

このAPIを踏襲しています。
処理系の対応具合は、ドキュメントによれば、

             WP   WL   WAR WOR WM  WHT
  allegro   
  ccl         x    x    x       x   n   -- WHT native.
  clisp       n    n    n   n   n   n   -- full support - native
  cmucl       n    x    x       x   x   -- partial support (missing WEAK-OR-RELATION)
  sbcl        n    x    x       x   x   -- partial support (missing WEAK-OR-RELATION)

とのこと(xがサポート、空白が未対応、nが処理系がネイティブにサポートしているもの)
ということでSBCLで試してみます。

(*:list-external-symbols :com.informatimago.clext.closer-weak)

(defun gc () (sb-ext:gc :full T))

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

(weak-pointer-value *wp*) ;=> (1) ; T (gc) ;=> NIL

*wp* ;=> #<broken weak pointer>

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

(defvar *a* (list 'a))

(defvar *weak-list* (make-weak-list (list *a* (list 'b) (list 'c)))) ;=> *WEAK-LIST*

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

(gc) ;=> NIL

*weak-list* ;=> #S(WEAK-LIST ; :HEAD (#<weak pointer: (A)> #<broken weak pointer> #<broken weak pointer>))

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

(defvar *a* (list 'a))

(defvar *weak-and* (make-weak-and-relation (list *a* (list 'b) (list 'c)))) ;=> *WEAK-AND*

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

(gc) ;=> NIL

*weak-and* ;=> #S(WEAK-AND-RELATION ; :OBJECTS #(#<weak pointer: (A)> #<broken weak pointer> ; #<broken weak pointer>))

(defvar *weak-or* (make-weak-or-relation (list *a* (list 'b) (list 'c)))) ;=> *WEAK-OR*

(gc) ;=> NIL

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

(defvar *key* (list 1))

(defvar *wa* (make-weak-mapping *key* :value)) ;=> *WA*

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

(setq *key* nil) ;=> NIL

(gc) ;=> NIL

*wa* ;=> #S(WEAK-MAPPING :KEY #<broken weak pointer> :VALUE :VALUE)

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

動作を眺める限り、weak-or-relationが未対応というよりweak-and-relationが未完成のように見えますがどうなのでしょう。コードのコメントによればCMUCLとSBCLはこの辺りの対応が弱いようです。

まとめ

 今回は、com.informatimago.clext.closer-weakを紹介してみました。
この辺りの機能は大体どの処理系も横並びなのかと思っていましたが、CLISPの充実度合いが光ります。

comments powered by Disqus