CMU AIレポジトリ探検 (4) Artificial Flavors — #:g1

Posted 2011-03-28 10:07:00 GMT

特に決まった順番もなく彷徨っておりますが、今回は、CLOS関係の階層からArtificial Flavorsです。
-(http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/oop/clos/code/0.html)
Flavorsとは、CLOS以前のオブジェクト指向プログラミングの仕組みで、Smalltalkから影響を受けて作られました。
というよりもMITのLISPマシン自体がかなりAltoに影響を受けていたようですし、PARCとも交流があったようです。
Flavorsには、Smalltalkから強く影響を受けている初期のものと、80年代中後半CLにオブジェクト指向システムを加えようというときにSymbolicsが提案した総称関数ベースのNew Flavorsとがありますが、今回のArtificial Flavorsは、New Flavorsっぽい感じになります。
実際のところNew Flavorsっぽいというよりは、CLOSにちょっとマクロを被せただけ、という感じです。
Artificial Flavorsを使うとこんな感じに書けます。

(in-package :artificial-flavors)

(defflavor rectangle (height width) () :readable-instance-variables :writable-instance-variables :initable-instance-variables)

(defmethod (area rectangle) () (* (rectangle-height self) (rectangle-width self)))

;; => マクロ展開 (CL:DEFMETHOD AREA ((SELF RECTANGLE)) (SYMBOL-MACROLET ((HEIGHT (SLOT-VALUE SELF 'HEIGHT)) (WIDTH (SLOT-VALUE SELF 'WIDTH))) (* (RECTANGLE-HEIGHT SELF) (RECTANGLE-WIDTH SELF))))

;; Flavorのスロット名で参照できるので短かくも書ける (defmethod (area rectangle) () (* height width))

(let ((rect (make-instance 'rectangle :height 3 :width 4))) (area rect)) ;=> 12

deffravorの :readable-instance-variables、 :writable-instance-variables、 :initable-instance-variablesというのは、指定するとdefstructのようにセッターやゲッターの設定を自動でしてくれるというものです。
defmethodも少し書式が違っていて、ボディ内ではSELFやスロット名で変数を呼び出せたりできるようです。

紹介ついでにASDFに対応させ、処理系依存っぽいところは、Closer to MOPを使うように修正したものをgithubに上げてみました
-(https://github.com/g000001/artificial-flavors)
適切に設定すれば、
(ql:quickload :artificial-flavors)
でロードできます。

ちなみに、Allegro CLには、より本格的なFlavorsが付いてくるようですので興味のある方は遊んでみると良いかなと思います。

comments powered by Disqus