CLOS(1)

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.dispName
http://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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください