#:g1: Clozure CL: Watched Objectsの紹介

Posted 2014-10-19 09:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の292日目です。

Clozure CL: Watched Objectsとはなにか

 Clozure CL: Watched Objectsは、Clozure CLの標準機能でオブジェクトへの書き込みを監視する機能です。

パッケージ情報

ドキュメントClozure Documentation: 4.12. Watched Objects

インストール方法

 Clozure CLの拡張なので標準で利用可能です。パッケージはCCLパッケージですが、CL-USERでも使えるようになっています。

試してみる

 基本的にどんなLispオブジェクトでも変更を検出できます(クラスのインスタンス等も可)

(defvar *v* (vector 0 1 2 3 4 5))

*v* ;=> #(0 1 2 3 4 5)

(watch *v*) ;=> #(0 1 2 3 4 5)

(incf (svref *v* 3) 10) ;!> Write to watched uvector #(0 1 2 3 4 5) at index 3

 少しわかりにくい監視対象のオブジェクトとしてハッシュテーブルとリストがあります。
ハッシュテーブルは、バックエンドのベクタの書き込みを禁止する方法で実現しているのでエラーが直感的でないことと、リストの場合は、1つのセルを監視対象とする点です。

(defvar *h* (*:plist-hash-table '(:a 0 :b 1 :c 2 :d 3 :e 4 :f 5)))

(watch *h*)

(incf (gethash :a *h*)) ;!> Write to watched uvector #<HASH-TABLE-VECTOR #x7FFFF7FC300D> at index 149

(defvar *L* (list 'car 'cadr 'caddr))

*L* ;=> (CAR CADR CADDR)

(watch *L*)

(setf (car *L*) 0) ;!> Write to the CAR of watched cons cell (CAR CADR CADDR)

(setf (cdr *L*) 0) ;!> Write to the CDR of watched cons cell (CAR CADR CADDR)

(setf (cadr *L*) 1) ;=> 1

*L* ;=> (CAR 1 CADDR)

また、解除には、unwatchを使います。

(unwatch *L*)

まとめ

 今回は、Clozure CL: Watched Objectsを紹介してみました。
Successfull Lispの30章でもwatchのことが取り上げられていました(Successful Lisp - Chapter 30)が、watchがあるのはどうもMCL系統だけみたいですね。
デバッグの時には活躍することもありそうです。

comments powered by Disqus