Posted 2021-12-12 20:23:45 GMT
Lisp一人 Advent Calendar 2021 13日目の記事です。
どうやら、Common Lispのメタクラスに関してはLOOPSからの影響が大きいらしい、というか、Common Lispに先行するオブジェクト指向システムの中でメタクラスを持っているものがLOOPS(→CommonLoops)位なので、そりゃそうだろう、というところなのかもしれません。
最近、主にLOOPS方面からオブジェクト指向プログラミングを解説した文献を読んでいたのですが、LOOPSでは1980年代前半からメタクラスをmixinして使うようなことが行なわれていたようです。
LOOPSのソースが公開されているので、少し眺めてみると、マニュアルに記載がある基本的なメタクラスの定義をみつけることができました。
https://github.com/Interlisp/loops/blob/main/users-src/LOOPSMIXIN
何やら謎めいたものが多いのですが、オブジェクトに日付と作成ユーザーのデータを入れこむDatedObject
という定義があるので、これをCommon Lispで真似してみましょう。
;;; LOOPS
(DEFCLASS DatedObject
(MetaClass Class doc "Mixin to record the creator and date of creation for objects." Edited%:
(* RBGMartin "19-Feb-87 14:21"))
(Supers Object)
(InstanceVariables (created NIL %:initForm (DATE)
doc "date and time of creation of object")
(creator NIL %:initForm (USERNAME)
doc "USERNAME of creator of object")))
使われ方が良く分からないのですが、こんな感じに書けるでしょう。
(defun user-name ()
#+lispworks
(sys:get-user-name)
#-(or lispworks)
(car (last (pathname-directory (user-homedir-pathname)))))(defun date ()
(multiple-value-bind (.s .m .h d m y)
(cl:get-decoded-time)
(format nil "~D-~2,'0D-~2,'0DT~2,'0D:~2,'0D:~2,'0D" y m d .h .m .s)))
(defclass dated-class (standard-class)
())
(defmethod validate-superclass ((c dated-class) (s standard-class))
T)
(defclass dated-object (standard-object)
((created :initform (date) :documentation "date and time of creation of object")
(creator :initform (user-name) :documentation "USERNAME of creator of object"))
(:metaclass dated-class)
(:documentation "Mixin to record the creator and date of creation for objects."))
(describe (make-instance 'dated-object))
#<dated-object 408019AFD3> is a dated-object
created "2021-12-13T05:10:11"
creator "mc"
このDatedObject
に関しては、standard-object
のサブクラスにするだけで良いのですが、なんとなく別のメタクラスにしてみました。
しかし、一体これをどう使うんだ……。
Common LispはもともとMACLISP系のLispをまとめたものなので、オブジェクト指向システムについてもMIT系のFlavorsの影響が大なようではありますが、実際の中身は割とXerox系のオブジェクト指向システムな気がしています。
案外、Flavorsはメソッドコンビネーションや構文等、コードとして目に付く表面的なところに影響が大きいのかもしれません。
ちなみに、メタオブジェクトプロトコルのように一連のメソッドを規約として構成するプロトコルという概念もLOOPS方面のオブジェクト指向システムではお馴染みの手法だったようです。
この辺りのことが書いてある、上述のObject-Oriented Programming: Themes and Variationsは面白いのでお勧めです。
■
HTML generated by 3bmd in LispWorks 7.0.0