ESP – Prologでオブジェクト指向
その昔、ESP(Extended Sequential Prolog)という
Prologにオブジェクト指向を加えたような言語があったそうです。
このESPはFlavorsを参考にして作られており、なかなか面白いです。
ESPについての資料第五世代コンピュータプロジェクト・アーカイブスにおいてあります。
T. Chikayama, “Unique Features of ESP”
ここから分かるように、ESPではクラスの多重継承が可能で、
beforeデモン、afterデモンなんてものがあります。
class with_a_lock has instance component lock is lock; before:open(Obj) :- unlocked(Obj!lock); ... end. class door has instance component state := closed; :open(Door) :- Door!state := open; ... end. class door_with_a_lock has nature door, with_a_lock; end.
クラスwith_a_lockは成分lockを持ち、その初期値値はlock(これはアトム)です。
また、beforeデモン述語openを持ち、これは引数のunlock(ここでは定義されていない)を行います。
クラスdoorは成分stateを持ち、その初期値はclosedです。
また、述語openを持ち、これは引数のlockスロットの値をopenに設定します。
クラスdoor_with_a_lockはdoorとwith_a_lockを継承しています。
ここで次のように、door_with_a_lockのインスタンスを作り、
openを呼ぶと、まずbeforeデモンによりwith_a_lockのopenが呼ばれ、
その後にdoorのopenが呼ばれるという仕組みです。
:new(#door_with_a_lock, DWL), :open(DWL),
これをCommon LispでCLOSを使って書くと次のような感じでしょうか。
(defclass with_a_lock () ((lock :accessor with_a_lock-lock :initform 'lock))) (defclass door () ((state :accessor door-state :initform 'closed))) (defclass door_with_a_lock (with_a_lock door) ()) (defmethod my-open :before ((obj with_a_lock)) (format t "with_a_lock open~%") (setf (with_a_lock-lock obj) 'unlock)) (defmethod my-open ((obj door)) (format t "door open~%") (setf (door-state Obj) 'open))
実行してみると、with_a_lockのopenが呼ばれてからdoorのopenが呼ばれているのが分かります。
CL-USER> (setf *dwl* (make-instance 'door_with_a_lock)) #<DOOR_WITH_A_LOCK #x19FAE3A9> CL-USER> (my-open *dwl*) with_a_lock open door open OPEN
Flavorsが出来た時期を考えてみたら、
影響を受けた言語が沢山あってもおかしくはないのに、
なかなか見かけないのはなんでだろ…