#:g1: closetteの紹介

Posted 2014-01-17 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の18日目です。

closetteとはなにか

 closetteは、The Art of the Metaobject Protocolの中で利用されている学習用に簡略化されたMOP付きのCLOSのサブセットです。

パッケージ情報

パッケージ名closette
Quicklisp×
参考サイトPackage: lang/lisp/oop/clos/closette/

インストール方法

 CMUのAIレポジトリ等で配布されているのでダウンロードして適当にCommon Lisp処理系で動かしましょう。
ちなみに、SBCLで動くようにしたものを私のgithubアカウントにアップしています。
ASDFでロードできるので、local-projects以下に配置すれば、(ql:quickload :closette)でロード可能です。

試してみる

(ql:quickload :closette)

(defpackage :closette-user (:use :cl :closette) (:shadowing-import-from :closette :standard-class :standard-object :slot-value :slot-boundp :slot-makunbound :slot-exists-p :class-of :class-name :defclass :find-class :method-qualifiers :defgeneric :ensure-generic-function :defmethod :add-method :remove-method :find-method :print-object :allocate-instance :make-instance :initialize-instance :reinitialize-instance :shared-initialize :change-class :update-instance-for-different-class :describe-object))

(cl:in-package :closette-user)

(defclass foo () (x y z))

(defclass bar (foo) (a))

(defclass bar (foo) (a)) ;!! Can't redefine the class named BAR.

(defmethod meth ((x bar)) :bar) ;!! No generic function named METH.

(defgeneric meth (x))

(defmethod meth ((x foo)) :foo)

(meth (make-instance 'bar)) ;=> :FOO

 クラスが再定義できなかったり、defmethodの前にはdefgenericが必要だったりと制限はありますが、学習用なので問題ないでしょう。
これを拡張するというのも学習課題の一つのようです。

 現在のCommon Lispの処理系は、CLOSの実装にPCL(Portable CommonLoops)を利用していたり、独自実装だったりするものが殆どですが、ABCLは、Closetteベースとのことです。
自分も何か使える部品がないかなと思ってABCLのソースを眺めてみましたが、結構Java化されていました…

まとめ

 今回は、closetteを紹介してみました。
AMOPを読む時にでも思い出して下さい。

comments powered by Disqus