#:g1: hu.dwim.defclass-starの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の158日目です。

hu.dwim.defclass-starとはなにか

 hu.dwim.defclass-starは、defclassや、define-conditionを簡便に書けるようにするユーティリティです。

パッケージ情報

パッケージ名hu.dwim.defclass-star
Quicklisp
Quickdocshttp://quickdocs.org/hu.dwim.defclass-star

インストール方法

(ql:quickload :hu.dwim.defclass-star)

試してみる

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

 定番拡張のdefclass*です。どういうものかといえばdefclassでアクセサや初期化キーワードのような大体似たようなものをずらっと書くことになりますが、

(defclass lorto ()
  ((x :initform 0 :initarg :x :accessor x)
   (y :initform 0 :initarg :y :accessor y)
   (z :initform 0 :initarg :z :accessor z)))

(let ((obj (make-instance 'lorto :x 42 :y 42 :z 42))) (list (x obj) (y obj) (z obj))) ;=> (42 42 42)

これがめんどくさいのでマクロでどうにかしようというものです。

(hu.dwim.defclass-star:defclass* kalki ()
  (x y z))

(let ((obj (make-instance 'kalki :x 42 :y 42 :z 42))) (list (x-of obj) (y-of obj) (setf (z-of obj) 97))) ;=> (42 42 97)

デフォルトではこんな感じの命名規約でアクセサ等が生成されます。

 名前を生成する関数はデフォルトを置き換え可能になっているので、

(hu.dwim.defclass-star:defclass* zilwan ()
  (x y z)
  (:accessor-name-transformer
   (hu.dwim.defclass-star:make-name-transformer 'zilwan. name))
  (:initarg-name-transformer 
   (hu.dwim.defclass-star:make-name-transformer :zilwan. name)))

(let ((obj (make-instance 'zilwan :zilwan.x 42 :zilwan.y 42 :zilwan.z 42))) (list (zilwan.x obj) (zilwan.y obj) (setf (zilwan.z obj) 97))) ;=> (42 42 97)

こんな感じにすることも可能です。

 また、クラスだけでなく、コンディション版もあります。

(hu.dwim.defclass-star:defcondition* milwa (simple-error)
  (x y z))

(error 'milwa :x 42 :y 43 :z 44 :format-control "~A" :format-arguments '("foo"))

;!> foo ;!> [Condition of type MILWA]

 コンディションは継承して使うことが多いので、そこまで必要な気もしませんが、便利なこともあるかもしれません。

まとめ

 今回は、hu.dwim.defclass-starを紹介してみました。
便利マクロの定番ですが、やはりクラスを沢山書く場合は便利そうです。

comments powered by Disqus