CLOS(1)
2007/09/08
CLOSは、javaとか、rubyとかのOOPとはかなり異なっているイメージがあります。On LispのCLOSの部分を読んだので、ちょっと触ってみました。手始めに、rubyクラス定義の例をCLOSで書いてみました。
class Car def initialize(carname) @name = carname end def dispName print(@name, "\n") end end car1 = Car.new("crown") car1.dispName car2 = Car.new("civic") car2.dispNamehttp://www.rubylife.jp/class/class/index2.html
CLOSに翻訳
(defclass AutoMobile () ((name :accessor car-name-of :initarg :name))) (defmethod disp-name ((car AutoMobile)) (format t "~a~%" (car-name-of car))) (setf car1 (make-instance 'AutoMobile :name "crown")) (disp-name car1) (setf car2 (make-instance 'AutoMobile :name "civic")) (disp-name car2) (disp-name 1)
クラス名carは、car関数と同じ名前になってしまうので、AutoMobileにしました。
実行結果
crown civic *** - NO-APPLICABLE-METHOD: When calling #<STANDARD-GENERIC-FUNCTION DISP-NAME> with arguments (1), no method is applicable.
(disp-name 1)は遊んでみました。disp-nameは関数の見た目と同じだし、クラスに属している訳でもないので、引数を間違えたり、別の関数と衝突することがありそうです。
クラス定義をパッケージに入れれば、少しは回避できるかもしれませんが、use-packageでメソッド名のsymbolをimportすると結局名前衝突は、防げないような気がします。回避方法は探しながら、つづく。
参考: http://www.fireproject.jp/feature/common-lisp/details/clos.html