#:g1: eggs: c3の紹介

Posted 2014-10-06 00:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の279日目です。

eggs: c3とはなにか

 eggs: c3は、Alex Shinn氏によるTiny CLOSのクラスの継承順位にC3線形化を導入するライブラリです。

パッケージ情報

パッケージ名eggs: c3
Chicken eggs:c3 - The Chicken Scheme wiki

インストール方法

$ sudo chicken-install c3

すれば、

(use c3)

で使えます。

試してみる

 CLOSやTiny CLOSは多重継承が可能ですが、こんな感じの場合、

(define O <object>)

(define-class F (O) ()) (define-class E (O) ()) (define-class D (O) ()) (define-class C (D F) ()) (define-class B (D E) ()) (define-class A (B C) ())

CLOS系の標準では、Aの継承順は、

(A B C D F E object top)

と決まります。
上記では、BはCに優先していて、B>D>Eで、かつC>D>Fなのに合体するとB>C>F>Eという並びになったりするのが直感的でないですが、これをより直感的な並びにするのが、C3線形化という方式です。

(use c3)

すれば、

(map class-name (class-cpl A))
;=> ("A" "B" "C" "D" "E" "F" "object" "top")

こんな感じに並びます。
C3線形化は、元々Dylan方面の人達によって考案されたものですが、現在Python等でも採用されているようです。
C3線形化について詳しくは元論文を参照してください。

Schemeの処理系で少し調べてみた範囲では、Tiny CLOS系のオブジェクト指向システムを持つ、STklos、Gauche、Sagittariusが標準で採用しているようです(STklos系?)。
その他mosh等は、Tiny CLOSそのままの方式のようです(CLOSと同じ)。

まとめ

 今回は、eggs: c3を紹介してみました。
C3線形化では元祖と言われるDylanですが、Open Dylan(論文にあるHarlequin Dylanの後継)では、2012年にやっと導入されたという意外な話があったりします。

comments powered by Disqus