Shammer's Philosophy

My private adversaria

CLOSエクササイズ第01回

Lispオブジェクト指向は、Common Lisp Object System(略してCLOS)という。まずは、簡単にクラスを定義して、フィールドに値をセットしてその値を標準出力に出力、という単純なことをやってみる。

クラスの定義は以下のとおり。defclassを使用する。

(defclass user ()
  ((name :accessor user-name)
   (pass :accessor user-password)
   (age  :accessor user-age)))

このクラスの意味としては、

  • userという名前のクラス
  • name、pass、ageというフィールドを持っている
  • name、pass、ageはそれぞれsetter/getterを持つ(:accessorがそれを意味する)
  • 各フィールドへのアクセサは、user-name、user-password、user-ageという名前で自動生成される

このuserクラスに名前をセットして、表示させる記述は以下のようになる。

(defparameter user-0 (make-instance 'user))
(setf (user-name user-0) "CharyBrown")
(format t "User-0 Name is ~A.~%" (user-name user-0))

make-instance + $ClassName で、$ClassNameに相当するクラスのインスタンスが生成される。
フィールドに値をセットするには、setf とクラス定義の際に同時に定義したアクセサを使用する。
フィールドの値にアクセスする場合も同じアクセサを使用できる。
上記のように実行すれば、

User-0 Name is CharyBrown.

という感じで出力される。だいぶJavaとは書き方が違う。早くこの書き方に慣れないと・・・