2010年11月8日月曜日

メソッドがクラスに属しているかのような錯覚をおこす為のマクロ

タイトルどおりのものを作ろうとしてみましたが案の定ぐだぐだに。

Common Lispのインスタンス変数(スロット)は :allocation :class と指定することで同じクラスのオブジェクトで共有されますが、共有されるだけで実際にインスタンスを生成しなければアクセスすることができません(たぶん)。

なので、クラス変数をメタクラスのインスタンス変数とすることで他のオブジェクト指向言語に近付こうとしてみました。

ソースコードはgistに置きました。

https://gist.github.com/662369

;; example
(class <foo> ()
(def sum ()
(+ @@a @b))

(setf @@a 10)

(def set-b (b)
(setf @b b)))

(defvar *obj* (make-instance '<foo> :b 20))

(sum *obj*)
;;=> 30

(set-b *obj* 10)

(sum *obj*)
;;=> 20

<foo>
;;=> #<#:META-<FOO>1306 <FOO>>

もっと頑張ってみても面白いかもしれない。

0 件のコメント:

コメントを投稿