#:g1: artificial-flavorsの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の49日目です。

artificial-flavorsとはなにか

 artificial-flavorsはMichael Travers氏が1988年に作成したFlavorsっぽいライブラリです。

パッケージ情報

パッケージ名artificial-flavors
Quicklisp
参考サイトPackage: lang/lisp/oop/clos/code/

インストール方法

 CMU AIレポジトリからダウンロードしてきて適当にロードします。
ASDF対応にしてgithubに上げていますので良かったらどうぞ。

試してみる

 おおこれがFlavorsかと期待してしまうのですが、CLOSをSymbolicsのNew Flavors風に見せるだけのマクロで、Flavors的な機能を知るには全く適していません。

defflavor

 CLOSでいうdefclassです。Flavorsだと:initable-instance-variables, :gettable-instance-variables, :settable-instance-variablesだった気がするのですが、New Flavorsだとwritable/readableだったのでしょうか。

defflavor

(defflavor montino ((a 0) (b 1) (c 2)) ()
  :initable-instance-variables
  :readable-instance-variables
  :writable-instance-variables)

のようなものが

(EVAL-WHEN (:COMPILE-TOPLEVEL :LOAD-TOPLEVEL :EXECUTE)
  (DEFCLASS MONTINO NIL
    ((A :INITFORM 0 :INITARG :A :ACCESSOR MONTINO-A)
     (B :INITFORM 1 :INITARG :B :ACCESSOR MONTINO-B)
     (C :INITFORM 2 :INITARG :C :ACCESSOR MONTINO-C))))

のように展開されます。

boundp-in-instance

 CLOSでいうslot-boundpです。

(defflavor makanito ((d 3)) (montino))

    (boundp-in-instance (make-instance 'makanito) 'd)
;=>  T

symbol-value-in-instance

 CLOSでいうslot-valueです。

(symbol-value-in-instance (make-instance 'makanito) 'a)
;=>  0

defmethod

 CLOS、Flavors、New Flavorsで引数の順番等が違うので混乱しますが、一応New Flavorsのdefmethodの順番が再現されています。

(defmethod (foo makanito) ()
  :foo)


(foo (make-instance 'makanito))
;=>  :FOO

まとめ

 今回は、artificial-flavorsを紹介してみました。
伝説のFlavorsのCommon Lisp実装は、そこそこネットで公開されているようなので、そのうち完成度の高いものを紹介してみたいと思います。
ちなみに、Allegro CLでは標準に添付されていて(require :flavors)で利用できたりします。

comments powered by Disqus